创建一个新对象:
1.new Object()
2.对象字面量创建:{}
3.Object.create();
从例子看区别吧
var obj1 = {
a:1
}
var obj2 = new Object(obj1);
console.log(obj1.__proto__ ==Object.prototype);
console.log(obj2);
console.log(obj2.a);
console.log(obj2.__proto__ ==Object.prototype);
var obj3 = Object.create(obj1);
console.log(obj3);
console.log(obj3.__proto__);
console.log(obj3.a);
console.log(obj3.__proto__.prototype==obj1.prototype);
image.png
new Object() 通过构造函数来创建对象, 添加的属性是在自身实例下。
Object.create() es6创建对象的另一种方式,可以理解为继承一个对象, 添加的属性是在原型下。
创建空对象:
var obj4 = Object.create(null);
console.log(obj4);
var obj5 = {};
console.log(obj5);
image.png
当用构造函数或对象字面量方法创建空对象时,是有原型属性的,即有proto;
当用Object.create()方法创建空对象时,对象是没有原型属性的。所以如果在使用call、apply、bind,把null或者undefined作为this的绑定时候,可以用Object.create()。
给对象原型添加属性和方法
var foo = {
name:'ldy',
age:[1,2,3],
say :function(){
console.log(this.name);
}
}
var f = Object.create(foo);
console.log(f)
console.log(f.__proto__.prototype ===foo.prototype)
function Foo(){}
Foo.prototype.name = "ldy"
Foo.prototype.age = [1,2,3,4]
Foo.prototype.say =function(){
console.log(this.name);
}
var f1 = new Foo();
console.log(f1)
console.log(f1.__proto__==Foo.prototype);
image.png
Object.create()的polyfill代码
function objectCreate(o){
function F(){};
F.prototype = o;
return new F();
}
我们首先创建一个函数F,然后通过.prototype属性使其指向我们想要关联的对象。最后再使用new F()来构造一个新对象来关联。






网友评论