“对象”的梳理与总结
原型链继承结构图
实例的原型 obj.__proto__ 是实例的[[Prototype]]暴露的访问接口,无法直接访问[[Prototype]];
创建对象
创建没有原型的空对象:
let obj = Object.create(null);
创建没有原型的非空对象:使用现有的对象来提供新创建的对象的__proto__;
let obj = Object.create(null,
{
// foo会成为所创建对象的数据属性
foo: {
writable:true,
configurable:true,
value: "hello"
}
);
创建有原型的空对象:
1. let obj ={};
2. let obj = new Object();或者let obj = new Object({});或let obj = new Object(null);或者let obj = new Object(undefined
);
3. let obj = Object.create({});
操作对象的属性
, prop, descriptorobj
=Object.defineProperty(obj)
、Object.defineProperties(obj, props)
:给对象添加或修改属性并指定该属性的配置;
descriptor=Object.getOwnPropertyDescriptor(obj, prop),Object.getOwnPropertyDescriptors(obj):返回其自有属性描述符对象;
obj.propertyIsEnumerable(prop):指定的属性是否可枚举:
delete obj.attr :删除实例对象属性;
Object.getOwnPropertyNames(obj):返回一个包含了指定对象所有的可枚举或不可枚举的属性名数组(不包括Symbol值作为名称的属性)。
Object.getOwnPropertySymbols(obj):返回一个给定对象自身的所有 Symbol 属性的数组;
obj.hasOwnProperty(prop):对象自身属性中是否具有指定的属性;
prop in object:如果指定的属性在指定的对象或其原型链中,则in
运算符返回true;
target
=Object.assign(target,...sources
)
:合并数个对象的自身可枚举属性为一个对象;
Object.entries(obj):返回给定对象自身可枚举属性的 [key, value]
数组(for-in 循环还会枚举原型链中的属性);
Object.keys(obj):返回一个由一个给定对象的自身可枚举属性组成的数组;
Object.values(obj):返回给定对象自身可枚举值的数组;
操作对象的原型
Object.setPrototypeOf(obj, prototype):设置对象的原型(即内部
[[Prototype]]
属性);
Object.getPrototypeOf(object):返回指定对象的原型(内部
[[Prototype]]
属性的值);
prototypeObj.isPrototypeOf(object):测试一个对象是否存在于另一个对象的原型链上;
检测对象或限制对象
b
oolean
=Object.is(value1, value2):比较两个值是否相同。所有 NaN 值都相等(这与==和===不同);
Object.preventExtensions(obj):让一个对象变的不可扩展,也就是永远不能再添加新的属性,仅阻止添加自身的属性,但其对象类型的原型依然可以添加新的属性(不能切断原型重新赋值),不可扩展对象的属性可能仍然可被删除;
Object.isExtensible(obj):判断对象是否可扩展,Object.preventExtensions
,Object.seal
或 Object.freeze
方法都可以标记一个对象为不可扩展;
Object.seal(obj):封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置(描述符configrable为false);
Object.isSealed(obj):判断一个对象是否被密封,密封对象是指那些不可
扩展
的,且所有自身属性都不可配置且因此不可删除(但不一定是不可写)的对象;
obj
=Object.freeze(obj):冻结对象、不能删除或更改实例和原型的任何属性和属性的描述符,如果一个属性的值是个对象,则这个对象中的属性是可以修改的;
Object.isFrozen(obj):判断对象是否已经冻结,一个对象是冻结的是指它不可
扩展
,所有属性都是不可配置的,且所有数据属性(即没有getter或setter组件的访问器的属性)都是不可写的;
obj.toString():
返回 [object Object],
返回一个表示该对象的字符串,
Object.prototype.toString
.call(data),用来检测数据的类型
;
obj.toLocaleString():返回调用
toString()
的结果,也就是返回表示对象的字符串,格式化数据的一种方式;
object.valueOf():返回指定对象的原始值;