从继承对象的函数调用原型的方法

Call Prototype's Method from Inheriting Object's Function

本文关键字:原型 方法 函数调用 对象 继承      更新时间:2023-09-26

我试图理解JavaScript的原型继承。在下面的代码片段中,我尝试从具有相同名称的继承对象的函数中调用函数。(本质上,我试图模仿称为"超级"方法)。

function Base() {
}
Base.prototype.hello = function() {
    return "hello";
}
function Sub() {
    Base.call(this);
}
Sub.prototype.hello = function() {
    return this.prototype.hello() + " world";
}
Sub.prototype = Object.create(Base.prototype);
Sub.prototype.constructor = Sub;
var sub = new Sub();
alert(sub.hello());

结果不是我所期望的... sub.hello()返回"hello",但我希望它返回"hello world"。出了什么问题?

在这里,

您在Sub原型上设置了一个 hello 属性,但原型被下一行的 Object.create 覆盖。

Sub.prototype.hello = function() {
    return this.prototype.hello() + " world";
}
Sub.prototype = Object.create(Base.prototype);

切换这些语句的顺序,并在 Sub hello 方法中使用对Base的引用。代码应如下所示:

function Base() {
}
Base.prototype.hello = function() {
    return "hello";
}
function Sub() {
    Base.call(this);
}
Sub.prototype = Object.create(Base.prototype);
Sub.prototype.hello = function() {
    return Base.prototype.hello() + " world";
}
Sub.prototype.constructor = Sub;
var sub = new Sub();
console.log(sub.hello()); // "hello world"