gpt4 book ai didi

javascript - Object.create vs new 在原型(prototype)继承方面

转载 作者:行者123 更新时间:2023-11-29 18:54:16 25 4
gpt4 key购买 nike

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

为什么我们无法访问使用 Object.create() 创建的对象的原型(prototype)属性/方法,但我们可以使用 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

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

如果您在控制台中检查Stanley 对象,您会发现以下结构:

enter image description here

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

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

Output: Have a good day!

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

enter image description here

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

另一个疑问是,为什么在 Object.create() 的情况下,原型(prototype)方法 byeBye()__proto__ 中被称为单独的属性作为“原型(prototype)”。而在 new 的情况下,byeBye() 函数可直接在 __proto__ 下使用。

注意:第二疑点相关图片请点击链接打开

感谢所有回复这篇文章的人!

最佳答案

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

所以代替:

var Stanley = Object.create(Greeting)

你想要

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

实例:

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

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

关于javascript - Object.create vs new 在原型(prototype)继承方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50074294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com