有着Java背景的我在转向JavaScript时,懒惰地试图坚持我所了解的面向对象编程方式,即经典继承。我正在开发一个Web应用程序(由我自己制作),并使用这种类型的继承。然而,我考虑改变我的代码,并重写OOP部分以进行原型继承(两个原因:我读到很多人说它更好,其次,我需要尝试另一种方式以更好地理解它)。
我的应用程序创建数据可视化(使用D3js,但这不是主题),并按以下方式组织我的代码:
我有几个基于相同结构的“构建器”。
调用构建器的脚本看起来像这样(它更加复杂,因为它根据用户输入选择正确的构造函数):
现在是“转换部分”。我阅读了很多相关的内容,从Douglas Crockford的文章,到《Eloquent Javascript》的部分内容。在Aadit M Shah的评论中,他提出了一个结构,看起来像这样:
然而,此时我卡住了。首先(技术问题),我能否在这种模式下声明变量(data、xCoord)而不初始化它们?就像
如果我理解正确的话,这意味着在调用构建器的脚本中,我将不再选择正确的构造函数(因为它不再存在),而是需要添加/修改单个构建器实例的原型中的方法。这就是应该做的吗?
还是说我应该尝试以完全不同的方式设计我的代码?如果是这样的话,你能给我一些建议/参考资料吗?
我的应用程序创建数据可视化(使用D3js,但这不是主题),并按以下方式组织我的代码:
function SVGBuilder( dataset ) {
this.data = dataset;
this.xCoord;
this.startDisplaying = function() {
// stuff
this.displayElement();
}
}
displayElement()
方法在继承自SVGBuilder的“类”中定义(SVGBuilder更或多或少是一个抽象类)。然后我有:
function SpiralBuilder( dataset ) {
SVGBuilder.call( this, dataset );
this.displayElement = function() {
// stuff
};
}
SpiralBuilder.inheritsFrom( SVGBuilder );
我有几个基于相同结构的“构建器”。
调用构建器的脚本看起来像这样(它更加复杂,因为它根据用户输入选择正确的构造函数):
var builder = new SpiralBuilder( data );
builder.startDisplaying();
现在是“转换部分”。我阅读了很多相关的内容,从Douglas Crockford的文章,到《Eloquent Javascript》的部分内容。在Aadit M Shah的评论中,他提出了一个结构,看起来像这样:
var svgBuilder = {
data: [],
xCoord: 0, // ?
create: function( dataset ) {
var svgBuilder= Object.create(this);
svgBuilder.data = dataset;
return svgBuilder;
},
startDisplaying: function() {
// stuff
}
}
然而,此时我卡住了。首先(技术问题),我能否在这种模式下声明变量(data、xCoord)而不初始化它们?就像
this.data;
这样的方式?其次,我应该如何创建继承关系?我只需手动将相应函数放入原型中吗?类似这样的操作:var spiralBuilder = builder.create( dataset );
spiralBuilder.prototype.displayElements = function() {
// Code to display the elements of a spiral
};
spiralBuilder.displayElements();
如果我理解正确的话,这意味着在调用构建器的脚本中,我将不再选择正确的构造函数(因为它不再存在),而是需要添加/修改单个构建器实例的原型中的方法。这就是应该做的吗?
还是说我应该尝试以完全不同的方式设计我的代码?如果是这样的话,你能给我一些建议/参考资料吗?
aInstance.someArray.push("fromA");
bInstance.someArray将会是["fromA"]
。 - HMR