【问题标题】:Cleanest way to write prototype inheritance in JS在 JS 中编写原型继承的最简洁方法
【发布时间】:2013-03-20 01:01:35
【问题描述】:

我还是个 JS 新手,我正在尝试了解使用原型和继承的最佳/最简洁的方式。

通常我这样写对象/原型定义:

var Foo = function(data) {
  this.data = data;
};
Foo.prototype = {
  someMethod: function() {
    return "whatever";
  }
};

我喜欢这个,因为我经常使用几层深的命名空间对象,所以它实际上可能看起来更像这样:

App.Model.FooModel = function(){...};
App.Model.FooModel.prototype = {...};

这很好,因为我不必输入每个方法的全名来编写原型,只需输入名称,即。 someMethod: function(){} 而不是 App.Model.FooModel.prototype.someMethod = function(){}

现在,我遇到的问题是我不确定如何使用 JS 中的继承来做到这一点。如果我这样做,我可以让继承正常工作:

var Child = function(){...};
Child.prototype = new Parent;
Child.prototype.someMethod = function(){...};

...但是现在在一个更复杂的应用程序中,我们又要为每个方法写出对象的全名,我觉得这既乏味又难以阅读。

所以,我的问题是:除了使用对象的全名附加所有子方法之外,是否有一种简洁、直接的方法来编写从另一个对象继承的原型?

谢谢!

【问题讨论】:

    标签: javascript syntax prototype


    【解决方案1】:

    嗯,这是 javascript,您可以随时编写自己的:

    function construct ( parent, fn, attr ) {
        fn.prototype = new parent();
    
        for (var x in attr) {
            fn.prototype[x] = attr[x];
        }
        return fn;
    }
    

    您可以根据需要进行 hasOwnProperty 检查,但为清楚起见,上述是最简单的实现。该函数将三个步骤合二为一。您现在可以简单地执行以下操作:

    var Foo = construct(
        Parent,
        function(data) {
            this.data = data;
        },
        {
            someMethod: function() {
                return "whatever";
            }
        }
    );
    

    如果您不喜欢该语法,您总能想出一个更好的语法。另一种实现是简单地实现 attr 扩展部分并正常进行继承:

    function extend (obj, attr) {
        for (var x in attr) {
            obj.prototype[x] = attr[x];
        }
        return obj;
    }
    

    再次,为清楚起见进行了简化。所以现在的语法变成了:

    var Foo = function(){...};
    Foo.prototype = new Parent;
    extend(Foo.prototype,{
        someMethod : function(){...}
    });
    

    【讨论】:

    • class 是保留字,但 Class 不是。
    • @gumballhead:谢谢,忘记了。将类更改为构造函数(反正更正确,因为它返回构造函数)
    • 小心function constructor,我相信你在关注window.constructor ...这并不一定重要,但可以想象有人会在window.constructor中存储东西。也许动词construct 更合适。
    • 什么是window.constructor?到处都找不到。
    • 啊,我明白了。构造函数属性。以前从未听说过。每天学些新东西。现在修好了。谢谢@GGG
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2010-12-06
    相关资源
    最近更新 更多