我已经搜索了很多关于它的信息,但我找不到任何直接答案
为什么我们无法访问使用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 对象,那么您将找到以下结构:
但是,如果我们使用 new
关键字来创建对象,那么我们可以直接访问byeBye()
原型函数
var Hamley = new Greeting()
console.log(Hamley.byeBye())
Output: Have a good day!
在控制台中检查 Hamley 对象的结构时,我们得到这样的结果:
我怀疑的是,为什么我们无法访问使用 Object.create()
创建的对象的原型属性/方法,但我们可以使用 new
< / strong>关键字。
另一个疑问是,为什么在Object.create()
的情况下,原型方法byeBye()
属于__proto__
中的单独属性,称为&#39; prototype
&#39 ;.在 new
的情况下,byeBye()
功能可直接在__proto__
下使用。
注意:请检查链接以打开与第二个疑问相关的图片
感谢所有回复此帖的人!
答案 0 :(得分:2)
您提供给Object.create
的对象应该是您希望新对象拥有的原型。您正在传递构造函数,因此使构造函数成为对象的原型。您可能打算使用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();
&#13;