Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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 调用原型';s函数_Javascript - Fatal编程技术网

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:Setting
Sub.prototype
to
Object.create(Base.prototype)
重写子
的构造函数?另外,为什么我们要在
Object.create()
中传递
Base.prototype
,而不是
Base
?@hendryau不,不,请看,但有一个极端情况,代码可能会因为任何原因依赖
prototype.constructor
,见ryeballer@hendryau回答你的第二个问题:因为你只想克隆
Base
的原型。调用
的构造函数在
的构造函数中处理。