【ES6复习】对象方法总结

不管用不用,Object都提供了很多很多的方法;这些方法由于使用频率较低,经常会有困惑哪些是ES6的?哪些方法有什么用?今天就简单列举下Object包含的方法以及简单说明。内容总结来自moz://a

ES5 方法

属性操作相关

[ES5]Object.defineProperty(obj, prop, descriptor)

定义一个对象的属性,并描述这个属性的特征。

enumerable:该属性是否能枚举,默认值为false,默认情况下for-in、Object.keys不能看到该属性。可以通过obj.propertyIsEnumerable(prop)测试某个属性是否可枚举

configurable:该属性描述是否可变,默认值为false,设置为false之后就不能重新设置了,当然也不能delete。

writable:该属性是否能够被重新赋值,默认值是false。

value:属性值,默认为undefined

1
2
3
4
5
6
7
8
9
10
11
var obj = {};

Object.defineProperty(obj, "foo", {
enumerable: false,
configurable: false,
writable: false,
value: "static",
// 不能和writable、value同时使用
get: function(){},
set: function(value){}
});

[ES5]Object.defineProperties(obj, props)

Object.defineProperty,不同的是props可枚举多个属性的描述。

[ES5]Object.getOwnPropertyDescriptor(obj, prop)

获取对象中某个属性的描述对象,返回值同defineProperty设置的对象,属性不存在时返回undefined

1
2
3
4
5
6
7
8
9
Object.getOwnPropertyDescriptor(obj, 'foo');

// 返回
{
configurable: false
enumerable: false
value: "static"
writable: false
}

[ES5]Object.keys(obj)

返回对象自身可枚举属性的数组。

[ES5]Object.getOwnPropertyNames(obj)

返回对象自身属性的数组,包含不可枚举属性。

原型操作相关

[ES5]Object.create(proto, [propertiesObject])

创建一个新对象,使用proto作为新对象的原型__proto__

propertiesObject作为该对象属性的描述,同Object.defineProperties()

1
2
3
4
5
6
7
8
9
10
11
var animal = {name:123}

var cat = Object.create(animal,{foo:{value:456, writable:true}})
// 返回
cat = {
foo: 456,
__proto__: {
name: 123,
__proto__: Object
}
}

我们知道对象的toString等方法都是在Object的原型上,如果我们想创建一个没有任何方法的对象时,可以使用Object.create(null)

控制对象属性相关

[ES5]Object.preventExtensions(obj) & Object.isExtensible(obj)

让对象成为一个不可扩展的对象,不能新增属性,但是可以根据现有属性的属性描述删除或者修改属性。

可以通过检isExtensible查对象是否可扩展。

[ES5]Object.seal(obj) & Object.isSealed(obj)

封闭一个对象,不能新增和删除属性,现有的属性也会被修改成不可配置,根据属性描述决定是否能修改属性值。 同样也是 Object.isExtensible 的。

可以通过isSealed检查对象是否为封闭的。

[ES5]Object.freeze(obj) & Object.isFrozen(obj)

冻结对象,什么都不可以修改。

可以通过isFrozen检查对象是否为冻结的。

ES6 方法

属性及基本操作

[ES6]Object.assign(target, …sources)

拷贝对象,特性

1、浅拷贝

2、同名属性的替换

3、只拷贝可枚举属性

4、属性描述不会被拷贝(所以getter会被调用)

[ES6]Object.is(value1, value2)

判断两个值是否是相同的值,它不会做这种类型转换。

与严格比较运算符===特性基本一致,不同之处在于:

1
2
3
4
5
+0 === -0 //true
NaN === NaN // false

Object.is(+0, -0) // false
Object.is(NaN, NaN) // true

[ES6]Object.values(obj) & Object.entries(obj)

与Object.keys特性类似,不过Object.values返回的是值,Object.entries返回的是键值对数组。

1
2
3
4
var obj = {foo: 123, foo2: 456};
Object.keys(obj); // ["foo", "foo2"]
Object.values(obj); // [123, 456]
Object.entries(obj); // [["foo", 123], ["foo2", 456]]

[ES6]Object.getOwnPropertyDescriptors(obj)

Object.getOwnPropertyDescriptor,返回该对象所以自身属性的描述。

原型的操作

[ES6]Object.setPrototypeOf(obj, prototype)

指定对象想的原型对象。

1
2
3
4
5
6
7
var animal = {name:123};

var cat = {foo:456};
Object.setPrototypeOf(cat, animal);

// 等同于
var cat = Object.create(animal,{foo:{value:456, ...}})

[ES6]Object.getPrototypeOf(object)

返回该对象的原型对象。

1
Object.getPrototypeOf(cat) === animal; // true

延伸阅读

Object.getPrototypeOf(Object) 不是 Object.prototype,见MDN web docs

继承和原型链推荐阅读:Inheritance_and_the_prototype_chain