Object.create和new object区别
Object.create()
创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
语法: Object.create(proto, [propertiesObject])
返回一个新对象,带着指定的原型对象和属性
proto
新创建对象的原型对象(传入undefined时会报错)。
propertiesObject
可选参数,如果没有指定为 undefined。propertiesObject表示要添加到新创建对象的不可枚举(默认)属性对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。
1)如果propertiesObject参数是 null 或非原始包装对象,则抛出一个 TypeError 异常
2)该参数对象默认为 undefined,另外只有该对象中自身拥有的可枚举的属性才有效,也就是说不可枚举属性及该对象的原型链上可枚举属性是无效的
Object.create(null)
Object.create(null)创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString(), hasOwnProperty()等方法
Object.create()与new object()对比
let o;
// 创建一个原型为null的空对象
o = Object.create(null);
// 打印此对象,将{}点开,显示的是 No Properties ,也就是在对象本身不存在属性跟方法,原型链上也不存在属性和方法
o = {};
// 以字面量方式创建的空对象就相当于:
o = Object.create(Object.prototype);
// 也等价于
o = new Object();
let test1 = {};
let test2 = new Object();
let test3 = Object.create(Object.prototype);
let test4 = Object.create(null);
console.log('test4.__proto__: ', test4.__proto__); // undefined 没有继承原型属性和方法
console.log(test1.__proto__ === test2.__proto__); // true
console.log(test1.__proto__ === test3.__proto__); // true
console.log(test2.__proto__ === test3.__proto__); // true
console.log(test1.__proto__ === test4.__proto__); // false
console.log(test2.__proto__ === test4.__proto__); // false
console.log(test3.__proto__ === test4.__proto__); // false
function Constructor(){}
o = new Constructor();
// 上面的一句就相当于:
o = Object.create(Constructor.prototype);
// 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码\
// 创建一个以另一个空对象为原型,且拥有一个属性p的对象
o = Object.create({}, {
p: {
value: 42,
}
});
// 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的:
console.log('o.p: ', o.p); // 42
o.p = 24; // Uncaught TypeError: Cannot assign to read only property 'p' of object '#<Object>
o.q = 12;
for (var prop in o) console.log(prop); // 'q'
delete o.p; // Uncaught TypeError: Cannot delete property 'p' of #<Object>
//创建一个可写的,可枚举的,可配置的属性p
o = Object.create({}, {
p: {
value: 42,
writable: true,
enumerable: true,
configurable: true
}
});
console.log('o.p: ', o.p); // 42
o.p = 24;
console.log('o.p: ', o.p); // 24
o.q = 12;
console.log('o.q: ', o.q); // 12
for (var prop in o) console.log(prop); // 'p' 'q'
delete o.p;
console.log('o.p: ', o.p); // undefined