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

参考文章

Object.create()
Object.create()和new object()和{}的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值