JavaScript - 构造函数中的继承
JavaScript - Inheritance in Constructors
对于JavaScript项目,我们希望引入对象继承以减少代码重复。但是,我无法完全按照我想要的方式工作,需要一些帮助。
我们使用模块模式。假设有一个超级元素:
a.namespace('a.elements.Element');
a.elements.Element = (function() {
// public API -- constructor
Element = function(properties) {
this.id = properties.id;
};
// public API -- prototype
Element.prototype = {
getID: function() {
return this.id;
}
};
return Element;
}());
以及从这个超级元素继承的元素:
a.namespace('a.elements.SubElement');
a.elements.SubElement = (function() {
// public API -- constructor
SubElement = function(properties) {
// inheritance happens here
// ???
this.color = properties.color;
this.bogus = this.id + 1;
};
// public API -- prototype
SubElement.prototype = {
getColor: function() {
return this.color;
}
};
return SubElement;
}());
您会注意到,我不太确定如何实现继承本身。在构造函数中,我必须能够将参数传递给超级对象构造函数并创建一个超级元素,然后用于创建继承的元素。我需要一种(舒适)的可能性来访问新对象的构造函数中超对象的属性。理想情况下,我可以对超级对象进行操作,就好像它是新对象的一部分一样。
我还希望能够创建一个新的子元素并对其调用getID()
。
我想要完成的似乎是传统的基于类的继承。但是,我想使用原型继承来做到这一点,因为这是JavaScript的方式。这甚至可行吗?
提前感谢!
编辑:修复了注释中建议的私有变量的使用。EDIT2:代码的另一个变化:重要的是id
可以从SubElement
的构造函数访问。
如果你愿意,你可以使用 JavaScript 的原型继承来做类继承。有关完整的示例和讨论,请参阅此其他答案,您可以轻松适应您的模式。
试试这段代码(继承方法取自这里):
function inherit(proto) {
function F() {};
F.prototype = proto;
return new F();
}
a.namespace('a.elements.SubElement');
a.elements.SubElement = (function() {
// private properties
var color;
// public API -- constructor
SubElement = function(properties) {
color = properties.color;
};
//inherit from parent
SubElement.prototype = inherit(a.elements.Element);
//add new methods to the prototype
SubElement.prototype.getColor = function() {
return color;
}
SubElement.prototype.doSomethinkWithID = function() {
var id = this.getID();
}
return SubElement;
}());
相关文章:
- 如何检查DOM节点是否继承自构造函数
- Javascript:继承原型而不重新定义构造函数
- 从类构造函数继承javascript
- JavaScript-构造函数参数和原型继承
- Javascript继承构造函数
- JavaScript继承构造函数.prototype
- 通过父构造函数创建主干继承视图
- JavaScript - 构造函数中的继承
- 构造函数原型-继承混淆
- Crockford 伪经典继承部分中的函数构造函数
- 通过构造函数属性和运算符实例设置继承
- 如何从“构造函数返回另一个对象”对象继承
- 从原型继承与从构造函数继承
- 继承和 TypeScript 错误:X 不是构造函数类型
- 命名空间和继承:具有JavaScript责任链的超级构造函数
- 我可以在 JavaScript 中模拟继承,只调用一个基构造函数,而不是使用原型吗?
- 继承:构造函数不运行'
- TypeScript类继承构造函数混淆
- Javascript继承构造函数
- 不能从父类继承构造函数