创建对象的三种方式
Object.create()
指定一个原型
proto对象及其属性 去创建一个新的对象
Object.create(null)/**__proto__: No properties */Object.create([])/**__proto__: Array */Objcet.create(null,{a:{writable:true,configurable:true,value:'hello'}})/** 设置属性是否可以修改和枚举 */
所以通过**Object.create()**创建的对象
- 必须接收原型对象 可以为null
- 属性设置 枚举 修改…
- 可以获取一个没有原型的干净对象
new Object()
通过new 运算符创建的对象 他的 proto 继承于Object的原型 即创建出来为Object的实列
对象字面量
原型
作用 :
javascript利用原型来描述对象
每个引用类型/实列都有一个proto
每个函数(构造函数)都有一个prototype(原型) 属性值是对象
每个引用类型/实列都有一个 proto 他指向自身构造函数prototype的值
每个函数都有prototype都有一个constructor指向自身
ES6 的箭头函数没有
prototype属性,但是有__proto__属性。
原型链
读一个属性,如果对象本身没有,则会继续访问对象的原型,直到原型为空或者找到为止。
通过 __proto__ 指针指向上一个原型 ,并从中继承方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终指向 null。这种关系被称为原型链 (prototype chain)
Array.__proto__ //Array 类Array.__proto__.__proto__ //Object类Array.__proto__.__proto__.__proto__ //null通过原型链一个对象会拥有定义在其他对象中的属性和方法
constructor 值只读吗
这个得分情况,对于引用类型来说 constructor 属性值是可以修改的,但是对于基本类型来说是只读的。
引用类型情况其值可修改这个很好理解,比如原型链继承方案中,就需要对 constructor重新赋值进行修正
对象属性描述
const object1 = {};Object.defineProperty(object1, 'property1', {value: 42, /**值 */writable: false, /** 是否可写 */enumerable: false, /** 枚举性 */configurable:false,/** 能否使用delete、能否需改属性特性、或能否修改访问器属/});
