在JS中编写原型继承的最简洁方法

时间:2013-03-20 01:01:36

标签: javascript syntax prototype

还有一些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(){...};

...但是现在在一个更复杂的应用程序中,我们又回来为每个方法写出对象的全名,我发现这些方法既繁琐又难以阅读。

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

谢谢!

1 个答案:

答案 0 :(得分: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(){...}
});