0

仍然有点 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(){...};

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

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

谢谢!

4

1 回答 1

4

好吧,这是 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(){...}
});
于 2013-03-20T02:37:48.227 回答