Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 就原型继承而言,Object.create与new_Javascript_Prototype_Prototypal Inheritance - Fatal编程技术网

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:很高兴这有帮助!如果这回答了您的问题,请查看在这种情况下如何操作。快乐编码!