2013-03-20 54 views
0

有点JS新手仍然存在,我试图理解使用原型和继承的最好/最干净的方法。在JS中编写原型继承的最干净的方法

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

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

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

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

嗯,这是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(){...} 
}); 
+1

'class'是一个保留字,虽然'Class'不是。 – 2013-03-20 02:57:43

+0

@ gumballhead:谢谢,忘了那个。将类更改为构造函数(无论如何,因为它返回构造函数,所以更正确) – slebetman 2013-03-20 04:13:51

+0

小心使用'函数构造函数',我相信你正在遮住'window.constructor' ...并不是必须的,但有人可以想象存储的东西在'window.constructor'中。也许动词'construct'会更合适。 – 2013-03-20 04:27:14