【问题标题】:JavaScript prototypal inheritanceJavaScript 原型继承
【发布时间】:2011-07-14 22:13:57
【问题描述】:

我正在尝试将一个对象的方法继承到另一个对象中。

我已经有了基础对象,它是使用 Revealing Module Pattern 实现的。

Page = function(url) {
    ...
    return { something: something_I_defined_above }
    ...
}

Page 应该继承的另一个对象被定义为单例。 在实际文件中,Page 是在 Link 之前定义的。

Link = function() {
   this.add = function() {}

   var instance = this;

   Link = function() { return instance; }
}

接下来我希望 Page 继承自 Link。

Page.prototype = new Link();

在测试这段代码时,我得到了 p 函数的未定义:

var p = new Page();
// The following line return undefined.
p.add;

【问题讨论】:

    标签: javascript inheritance prototype-programming


    【解决方案1】:

    您永远不会真正实例化 Page 对象。当您调用

    时,您所做的只是返回一个普通的对象字面量
    Page = function(url) {
        ...
        return { something: something_I_defined_above }
        ...
    }
    
    var p = new Page();
    

    此文字不继承自 Page.prototype。有一些方法可以解决这个问题,主要取决于您希望如何构建应用程序。

    例如,您可以返回一个继承自 Link 的对象,而不是让 Page 继承自 Link(这有意义吗?):

    Page = function(url) {
        ...
        var Constr = function(){};
        Constr.prototype = new Link();
        var instance = new Constr();
        instance.something = something_I_defined_above;
    
        return instance;
        ...
    }
    
    var p = new Page();
    

    我实际上不确定这里最好的方法是什么。这真的取决于你想要什么。我的建议是不要让它太复杂。

    【讨论】:

    • 链接对象也有类似的问题。他第一次调用它时,它返回 undefined。
    • @Matt:是的,但它是用new 调用的,所以它会在第一次调用时返回this,在任何后续调用时返回instance(有或没有new)。
    • 我怀疑问题出在显示模块模式上。我明白为什么它没有像我预期的那样工作。
    • @Felix 我不知道即使没有返回值,“新”调用也会返回“this”。有趣。
    • @Matt: 现在你知道了:) 如果你用new 调用一个函数,this 将引用一个继承自函数原型的新对象。如果函数没有显式返回object,则隐式返回this。您可以尝试返回一个数字或字符串,但您仍会看到this
    猜你喜欢
    • 2010-09-28
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多