还有一些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(){...};
...但是现在在一个更复杂的应用程序中,我们又回来为每个方法写出对象的全名,我发现这些方法既繁琐又难以阅读。
所以,我的问题是:是否有一种干净,直接的方式来编写从另一个对象继承的原型,除了使用对象的全名附加所有子方法?
谢谢!
答案 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(){...}
});