[JavaScript] Object.create

用法

Object.create(proto, [ propertiesObject ])

该方法创建一个拥有指定原型若干个指定属性的对象。

(1)proto
一个对象,作为新创建对象的原型。

注:
如果 proto参数不是null
或一个对象值
则抛出一个TypeError异常。

(2)propertiesObject可选。
该参数对象是一组属性与值,该对象的属性名称将是新创建的对象的属性名称,值是属性描述符(这些属性描述符的结构与Object.defineProperties()的第二个参数一样)。

注:
propertiesObject不能是 undefined
且只有该对象自身拥有的可枚举属性才有效,原型链上属性无效。

例子

var a=Object.create(null);    //创建一个__proto__为null的对象
var b=Object.create(Object.prototype);    //相当于new Object,即立即对象{}

var base={
    v:1
};
var sub=Object.create(base);    //让sub.__proto__===base,原型继承
console.log(sub.v);    //1

var obj=Object.create(Object.prototype,{
    v:{
        configurable:true,
        enumerable:true,

        writable:true,
        value:1
    }
});

注:
(1)如果configurable===false
则不能再改变configurableenumerable
可以将writabletrue改成false,但是不能从false改为true
value能否改变,取决于writable

(2)如果writable===false
obj.v重新赋值并不会报错,只是没有生效。

(3)对象的属性描述符有两种形式:数据描述符和存取描述符

共有的:
configurable:false 该属性是否可以被设置和删除
enumerable:false 该属性是否可以被枚举

数据描述符:
writable:false 该属性是否可以被赋值运算符改变
value:undefined 该属性的值

存取描述符:
get:undefined 该属性的读取器方法
set:undefined 该属性的写入器方法

(4)Object.defineProperty有副作用会改变obj,但也会返回改变后的同一个obj对象

var obj2=Object.defineProperty(obj,'v',...)
obj2===obj

(5)我们可以使用Object.getPrototypeOf来获取一个对象的原型(相当于__proto__

var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto

参考

MDN: Object.create
MDN: Object.getPrototypeOf

点赞