我想在一些类之间建立继承关系。例如,Element
将成为抽象超类,然后Rect
和Triangle
作为子类。
Element
在其构造函数中有一些公共代码。
Element = function (id, attr) {
// Setting attributes and id...
this._callback_click = _bind(this._callback_click, this);
};
我一直在阅读一些问题,such as this,似乎有不止一种方法可以实现,尽管最终可能等同。
使用new
:
Rect = function (id, attr) {
Element.call(this, id, attr);
// Setting Rect's own attributes...
};
Rect.prototype = new Element(null, {});
Rect.prototype.constructor = Rect;
// Seems somewhat pointless to pass these arguments, but I have none
// at this point in the code.
使用Object.create
:
Rect = function (id, attr) {
Element.call(this, id, attr);
// Setting Rect's own attributes...
};
Rect.prototype = Object.create(Element.prototype);
Rect.prototype.constructor = Rect;
使用临时构造函数:
function makePrototype(superclass) {
function f() { }
f.prototype = superclass.prototype;
f.prototype.constructor = f;
return new f();
}
Rect = function (id, attr) {
Element.call(this, id, attr);
// Setting Rect's own attributes...
};
Rect.prototype = makePrototype(Element);
Rect.prototype.constructor = Rect;
使用clone
:
function clone(object) {
var key, copy = {};
for (key in object) { copy[key] = object[key]; }
return copy;
}
Rect = function (id, attr) {
Element.call(this, id, attr);
// Setting Rect's own attributes...
};
Rect.prototype = clone(Element.prototype);
Rect.prototype.constructor = Rect;
这些方法中的任何一种方法都优于其他方法吗?
我怀疑clone
方法可能不是正确,虽然我不确定原因是什么。
最后,如果我错了,请更正我,但我相信new
方法可能会显示意外结果,因为_callback_click
被绑定两次(设置原型时,以及调用{{1}时Element
)内的构造函数。