Javascript 调用原型';s函数
当我运行下面的脚本时,我得到的错误是Javascript 调用原型';s函数,javascript,Javascript,当我运行下面的脚本时,我得到的错误是sub.hello不是一个函数。为什么不呢Sub的原型是Base,Base具有hello功能。既然Sub没有功能hello,那么不应该检查其原型的功能吗 function Base() { } Base.prototype.hello = function() { alert("hello"); } Sub.prototype = Base; function Sub() { Base.call(this); } var sub = ne
sub.hello
不是一个函数。为什么不呢Sub
的原型是Base
,Base
具有hello
功能。既然Sub
没有功能hello
,那么不应该检查其原型的功能吗
function Base() {
}
Base.prototype.hello = function() {
alert("hello");
}
Sub.prototype = Base;
function Sub() {
Base.call(this);
}
var sub = new Sub();
sub.hello();
功能必须存在于原型上,而不是原型的原型上 你已经有效地做到了这一点:
Sub.prototype.prototype.hello = function () { }
因此,与其使用Base.prototype.hello
,不如使用Base.hello
:
函数基(){}
Base.hello=function(){alert(“hello”);}
Sub.prototype=基础;
函数子(){
基地。呼叫(此);
}
var sub=新sub();
sub.hello()代码>在JavaScript中执行继承的更好方法是使用对象。创建函数:
function Base() {
}
Base.prototype.hello = function() {
alert("hello");
}
function Sub() {
Base.call(this);
}
Sub.prototype = Object.create(Base.prototype);
// Restore constructor property
Sub.prototype.constructor = Sub;
var sub = new Sub();
sub.hello();
看
要进一步阅读,请查看@WouterHuysentruit Downvote帖子,而不是人物。不要因为我指出你错了就做一个混蛋。这是本网站的规则。就在你删除答案并收到否决票的那一瞬间,我看到你的声誉下降了1。我否决了投票,因为你从Base的原型中删除了hello。别那么自作聪明,告诉他继承遗产的真正方式js@WouterHuysentruit我的帖子确实展示了在JS中继承的“真实”方式。@meagar你的第一个片段令人困惑,如果您试图创建一个无法实例化的抽象类,那么我认为最好使用静态方法创建一个对象,该方法将被分配给Sub的原型。此外,第二个代码片段实际上调用基本构造函数,而不是使用Object.create(Base.prototype)调用@WouterHuysentruit
没有。它没有什么问题,只是不必要地调用了构造函数代码>因为您已经用Base的构造函数重写了Sub的构造函数。是的,它仍然在运行,我关注的是构造函数属性提供有用的情况,例如@WouterHuysentruit,@ryeballar:SettingSub.prototype
toObject.create(Base.prototype)
用基
重写子
的构造函数?另外,为什么我们要在Object.create()
中传递Base.prototype
,而不是Base
?@hendryau不,不,请看,但有一个极端情况,代码可能会因为任何原因依赖prototype.constructor
,见ryeballer@hendryau回答你的第二个问题:因为你只想克隆Base
的原型。调用基
的构造函数在子
的构造函数中处理。