“对象”的梳理与总结


原型链继承结构图

实例的原型 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({});

操作对象的属性

obj=Object.defineProperty(obj, prop, descriptor)Object.defineProperties(objprops):给对象添加或修改属性并指定该属性的配置;

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):测试一个对象是否存在于另一个对象的原型链上;

检测对象或限制对象

boolean=Object.is(value1, value2):比较两个值是否相同。所有 NaN 值都相等(这与==和===不同);

Object.preventExtensions(obj):让一个对象变的不可扩展,也就是永远不能再添加新的属性,仅阻止添加自身的属性,但其对象类型的原型依然可以添加新的属性(不能切断原型重新赋值),不可扩展对象的属性可能仍然可被删除;

Object.isExtensible(obj):判断对象是否可扩展,Object.preventExtensionsObject.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():返回指定对象的原始值;