参考答案:
js中创建对象的方式一般有两种Object.create和new
1const Base = function(){}; 2const o1 = Object.create(Base); 3const o2 = new Base();
在讲述两者区别之前,我们需要知道:
那这样到底有什么不一样呢?
先来看看 Object.create
的实现方式
1Object.create = function (o) { 2 var F = function () {}; 3 F.prototype = o; 4 return new F(); 5};
可以看出来。Object.create是内部定义一个对象,并且让F.prototype对象 赋值为引进的对象/函数 o,并return出一个新的对象。
再看看 const o2 = new Base()
的时候,new做了什么。
1var o1 = new Object(); 2o1.[[Prototype]] = Base.prototype; 3Base.call(o1);
new做法是新建一个obj对象o1,并且让o1的__proto__指向了Base.prototype对象。并且使用 call 进行强转作用环境。从而实现了实例的创建。
看似是一样的。我们对原来的代码进行改进一下。
1var Base = function () { 2 this.a = 2 3} 4var o1 = new Base(); 5var o2 = Object.create(Base); 6console.log(o1.a); // 2 7console.log(o2.a); // undefined
可以看到Object.create 失去了原来对象的属性的访问。
再进行下改造:
1var Base = function () { 2 this.a = 2 3} 4Base.prototype.a = 3; 5var o1 = new Base(); 6var o2 = Object.create(Base); 7console.log(o1.a); // 2 8console.log(o2.a); // undefined
小结
比较 | new | Object.create |
---|---|---|
构造函数 | 保留原构造函数属性 | 丢失原构造函数属性 |
原型链 | 原构造函数prototype属性 | 原构造函数/(对象)本身 |
作用对象 | function | function和object |
最近更新时间:2024-08-10