【JS内置对象】Object
静态方法
Object.assign(target, ...sources)
将所有可枚举属性的值从一个或多个源对象分配到 target
,返回合并后的 target
- 同名属性后面覆盖前面
- 只会拷贝源对象自身的并且可枚举的属性到目标对象
- 方法使用源对象的
[[Get]]
和目标对象的[[Set]]
,所以它会调用相关getter
和setter
。 - 浅拷贝
- 无法拷贝继承属性和不可枚举属性
Object.defineProperty(obj, prop, descriptor)
修改对象的某个属性的描述符,属性不存在时创建,省略某些字段时会使用默认值
descrioptor 可配置属性
- configurable,能否修改该属性的描述符,默认为
false
- enumerable,能否被枚举,默认 false
- value,该属性的值,默认为
undefined
- writable,值可否被修改
- get,属性的 getter
- set,属性的 setter
继承属性
如果访问者的属性是被继承的,它的 get
和 set
方法会在子对象的属性被访问或者修改时被调用。如果这些方法用一个变量存值,该值会被所有对象共享
function myclass() {}
var value;
Object.defineProperty(myclass.prototype, "x", {
get() {
return value;
},
set(x) {
value = x;
},
});
var a = new myclass();
var b = new myclass();
a.x = 1;
console.log(b.x); // 1
Object.defineProperties(obj, props)
同上,可同时修改对象的多个属性,可配置属性与 Object.defineProperty()
一致
var obj = {};
Object.defineProperties(obj, {
property1: {
value: true,
writable: true,
},
property2: {
value: "Hello",
writable: false,
},
// etc. etc.
});
Object.create(proto, [propertiesObject])
可在创建对象时设置属性及属性的属性描述符
Object.create(
{},
{
property1: {
value: true,
writable: true,
},
property2: {
value: "Hello",
writable: false,
},
// etc. etc.
}
);
Object.freeze(obj)
冻结对象,冻结后的对象无法被修改,包括添加、删除属性,不能修改属性的属性描述符,不能修改原型
返回值为源对象
如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象
Object.isFrozen(obj)
判断对象是否冻结
Object.getOwnPropertyDescriptor(obj, prop)
获取对象指定属性的属性描述符状态
返回值为对象。没有 getter
和 setter
时返回对象上没有这两个属性
Object.getOwnPropertyDescriptor({ a: 1 }, "a");
/*{
configurable: true
enumerable: true
value: 1
writable: true
}*/
Object.entries(obj)
获取一个给定对象自身可枚举属性的键值对数组
返回值为二维数组
Object.entries({
age: 1,
name: 2,
});
// [[age,1],['name',1]]
Object.getOwnPropertyNames(obj)
返回对象自身的属性名数组(包括不可枚举属性),不包括原型链上的属性
Object.keys(obj)
返回对象自身属性名数组(不包括不可枚举属性),不包括原型链上的属性
Object.values(obj)
返回对象自身所有可枚举属性值的数组
Object.getPrototypeOf(obj)
获取对象的原型对象
Object.setPrototypeOf(obj, prototype)
设置对象原型
不常用但感觉有用的方法
Object.getOwnPropertySymbols(obj)
获取对象自身所有Symbol
属性的数组
其他方法
Object.is(value1, value2)
见《相似性判断》文章Object.prototype.valueOf()
和Object.prototype.toString()
见 《关于 valueOf 方法和 toString 方法》文章
原型方法
obj.hasOwnProperty(prop)
判断对象自身是否有指定的属性
obj.propertyIsEnumerable(prop)
判断对象上的指定属性是否可枚举
obj1.isPrototypeOf(obj2)
判断 obj1 是否存在于 obj2 的原型链上
对象的状态
只有自身的原始属性值受影响,引用类型值不受影响
扩展
不可扩展的对象不能添加新属性,但是可以修改和删除已有属性
用 Object.preventExtensions(obj)
将对象变为不可扩展,Object.isExtensible(obj)
方法判断对象是否可扩展
密封
被密封的对象不能添加和删除属性,可以修改已有属性
用 Object.seal(obj)
将对象变为密封,Object.isSealed(obj)
方法判断对象是否密封
冻结
被冻结的对象不能做任何操作
用 Object.freeze(obj)
将对象冻结,Object.isFrozen(obj)
方法判断对象是否冻结