我仍然是一个 JS 新手,我正在尝试了解使用原型(prototype)和继承的最佳/最干净的方法。
通常我会这样编写对象/原型(prototype)定义:
var Foo = function(data) {
this.data = data;
};
Foo.prototype = {
someMethod: function() {
return "whatever";
}
};
我喜欢这个,因为我经常使用几层深度的命名空间对象,所以它实际上可能看起来更像这样:
App.Model.FooModel = function(){...};
App.Model.FooModel.prototype = {...};
这很好,因为我不必输入每个方法的全名来编写原型(prototype),只需输入名称即可,即。 someMethod: function(){}
而不是 App.Model.FooModel.prototype.someMethod = function(){}
。
现在,我遇到的问题是我不知道如何在 JS 中使用继承来做到这一点。如果我这样做,我可以让继承工作正常:
var Child = function(){...};
Child.prototype = new Parent;
Child.prototype.someMethod = function(){...};
...但现在在一个更复杂的应用程序中,我们又回到为每个方法写出对象的全名,我发现这既乏味又难以阅读。
所以,我的问题是:除了使用对象的全名附加所有子方法之外,是否有一种干净、直接的方法来编写从另一个对象继承的原型(prototype)?
谢谢!
最佳答案
嗯,这是 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(){...}
});
关于javascript - 在 JS 中编写原型(prototype)继承的最简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15513425/