在某种程度上,我还是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(){...};...but现在在一个更复杂的应用程序中,我们又要为每个方法写出对象的全名,我发现这既乏味又难于阅读。
所以,我的问题是:除了使用对象的全名附加所有子方法之外,是否有一种干净、直接的方法来编写继承自另一个对象的原型?
谢谢!
发布于 2013-03-20 10:37:48
好吧,这是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(){...}
});https://stackoverflow.com/questions/15513425
复制相似问题