创建对象的三种方式

Object.create()

指定一个原型proto对象及其属性 去创建一个新的对象

  1. Object.create(null)
  2. /**__proto__: No properties */
  3. Object.create([])
  4. /**__proto__: Array */
  5. Objcet.create(null,{
  6. a:{
  7. writable:true,
  8. configurable:true,
  9. value:'hello'
  10. }
  11. })
  12. /** 设置属性是否可以修改和枚举 */

所以通过**Object.create()**创建的对象

  1. 必须接收原型对象 可以为null
  2. 属性设置 枚举 修改…
  3. 可以获取一个没有原型的干净对象

    new Object()

    通过new 运算符创建的对象 他的 proto 继承于Object的原型 即创建出来为Object的实列

对象字面量

let obj = {}

原型

作用 :javascript 利用原型来描述对象

每个引用类型/实列都有一个proto
每个函数(构造函数)都有一个prototype(原型) 属性值是对象
每个引用类型/实列都有一个 proto 他指向自身构造函数prototype的值
每个函数都有prototype都有一个constructor指向自身

ES6 的箭头函数没有prototype属性,但是有__proto__属性。

原型链

读一个属性,如果对象本身没有,则会继续访问对象的原型,直到原型为空或者找到为止。
通过 __proto__ 指针指向上一个原型 ,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null。这种关系被称为原型链 (prototype chain)

  1. Array.__proto__ //Array 类
  2. Array.__proto__.__proto__ //Object类
  3. Array.__proto__.__proto__.__proto__ //null
  4. 通过原型链一个对象会拥有定义在其他对象中的属性和方法

constructor 值只读吗

这个得分情况,对于引用类型来说 constructor 属性值是可以修改的,但是对于基本类型来说是只读的。
引用类型情况其值可修改这个很好理解,比如原型链继承方案中,就需要对 constructor重新赋值进行修正

对象属性描述

  1. const object1 = {};
  2. Object.defineProperty(object1, 'property1', {
  3. value: 42, /**值 */
  4. writable: false, /** 是否可写 */
  5. enumerable: false, /** 枚举性 */
  6. configurable:false,
  7. /** 能否使用delete、能否需改属性特性、或能否修改访问器属/
  8. });