Object.create vs new原型继承

时间:2018-04-28 08:02:31

标签: javascript prototype prototypal-inheritance

我已经搜索了很多关于它的信息,但我找不到任何直接答案

为什么我们无法访问使用Object.create()创建的对象的原型属性/方法,但我们可以使用new关键字?

让我们考虑构造函数Greeting,如下所示:

function Greeting() {   
}
Greeting.prototype.byeBye = function(){
    console.log("Have a good day!")
}

现在我使用Object.create()方法

从此构造函数创建一个对象
var Stanley = Object.create(Greeting)
console.log(Stanley.byeBye())

Output -  Error: Stanley.byeBye is not a function

这意味着无法使用 Stanley 对象直接访问byeBye()函数

如果您在控制台中检查 Stanley 对象,那么您将找到以下结构:

enter image description here

但是,如果我们使用 new 关键字来创建对象,那么我们可以直接访问byeBye()原型函数

var Hamley = new Greeting()
console.log(Hamley.byeBye())

Output: Have a good day!

在控制台中检查 Hamley 对象的结构时,我们得到这样的结果:

enter image description here

我怀疑的是,为什么我们无法访问使用 Object.create() 创建的对象的原型属性/方法,但我们可以使用 new < / strong>关键字。

另一个疑问是,为什么在Object.create()的情况下,原型方法byeBye()属于__proto__中的单独属性,称为&#39; prototype &#39 ;.在 new 的情况下,byeBye()功能可直接在__proto__下使用。

注意:请检查链接以打开与第二个疑问相关的图片

感谢所有回复此帖的人!

1 个答案:

答案 0 :(得分:2)

您提供给Object.create的对象应该是您希望新对象拥有的原型。您正在传递构造函数,因此使构造函数成为对象的原型。您可能打算使用new将使用的相同对象,该对象位于构造函数的prototype属性上。

所以而不是:

var Stanley = Object.create(Greeting)

你想要

var Stanley = Object.create(Greeting.prototype)
// ---------------------------------^^^^^^^^^^

直播示例:

&#13;
&#13;
function Greeting() {   
}
Greeting.prototype.byeBye = function(){
    console.log("Have a good day!");
}

var Stanley = Object.create(Greeting.prototype);
Stanley.byeBye();
&#13;
&#13;
&#13;