Javascript 就原型继承而言,Object.create与new
我找了很多,但找不到任何直接的答案 为什么我们不能访问使用Javascript 就原型继承而言,Object.create与new,javascript,prototype,prototypal-inheritance,Javascript,Prototype,Prototypal Inheritance,我找了很多,但找不到任何直接的答案 为什么我们不能访问使用object.create()创建的对象的原型属性/方法,但我们可以使用new关键字? 让我们考虑一个构造函数问候>代码>如下: function Greeting() { } Greeting.prototype.byeBye = function(){ console.log("Have a good day!") } 现在,我使用object.create()方法从这个构造函数创建一个对象 var Stanley =
object.create()
创建的对象的原型属性/方法,但我们可以使用new
关键字?
让我们考虑一个构造函数<代码>问候>代码>如下:
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
关键字
另一个疑问是,为什么在Object.create()
的情况下,prototype方法byeBye()
在\uuuu proto\uuu
中属于单独的属性,称为“prototype
”。而在新建
的情况下,byeBye()
函数可直接在\uuuuuu协议下使用
注意:请检查链接以打开与第二个问题相关的图像
感谢所有回复这篇文章的人 你给对象的对象。create
应该是你希望新对象拥有的原型。您正在传递构造函数,这使得构造函数成为对象的原型。您可能打算使用构造函数的prototype
属性上的new
将使用的相同对象
因此,不是:
var Stanley = Object.create(Greeting)
你想要
var Stanley = Object.create(Greeting.prototype)
// ---------------------------------^^^^^^^^^^
实例:
函数问候语(){
}
Greeting.prototype.byeBye=函数(){
log(“祝您愉快!”);
}
var Stanley=Object.create(Greeting.prototype);
斯坦利·拜拜()代码>只是一个有用的旁注,调用新问候语
和Object.create(问候语.prototype)
之间的唯一区别是没有调用问候语
构造函数,但是,如果构造函数不包含带表达式的return
语句,则返回的对象是相同的。@PatrickRoberts:确实如此——特别是,如果构造函数不返回对象(返回原语或null将被忽略)。谢谢你的回答,t.J.Crowder。但我有一个疑问。当使用var Stanley=Object.create(Greeting)
时,Greeting
函数成为Stanley
的原型byeBye()
是问候语构造函数的原型方法。那么,为什么这个方法不属于问候语构造函数的\uu proto\uu
?在控制台中检查时,为什么它出现在构造函数的名为prototype
的东西中?@VaibhavSharma:byeBye
是问候语的属性。prototype
,而不是问候语
。如果使用问候语
(函数)作为原型,byeBye
不在对象的原型链中。@VaibhavSharma:很高兴这有帮助!如果这回答了您的问题,请查看在这种情况下如何操作。快乐编码!