建设者能帮我吗?(即JavaScript中的构造函数有什么好处?)
我已经使用GoogleCharts+jQueryAPI编写了一些很好的包装,当你鼠标悬停时,这些包装会进行很好的更新。我目前正在重构我的代码。我有一些函数返回具有属性的对象,这些对象本身具有其他属性,等等。有很多函数返回包含属性的对象的数组,其中一些是数组,等等 下面是我从ajax XML树加载ROC和似然表集合的代码示例:建设者能帮我吗?(即JavaScript中的构造函数有什么好处?),javascript,Javascript,我已经使用GoogleCharts+jQueryAPI编写了一些很好的包装,当你鼠标悬停时,这些包装会进行很好的更新。我目前正在重构我的代码。我有一些函数返回具有属性的对象,这些对象本身具有其他属性,等等。有很多函数返回包含属性的对象的数组,其中一些是数组,等等 下面是我从ajax XML树加载ROC和似然表集合的代码示例: function XMLAttributeTable(subtree, point_name, arr_of_attributes) { // note: assu
function XMLAttributeTable(subtree, point_name, arr_of_attributes) {
// note: assumes numeric attribute values
var attributes_for_each_point = [];
$(subtree).find(point_name).each(function() {
row = $(this);
var point = {};
arr_of_attributes.forEach( function(attr_name) {
point[attr_name] = parseFloatPlus(row.attr(attr_name));
});
attributes_for_each_point.push(point);
});
return attributes_for_each_point;
}
function XMLAttributeTableCollection(subtree, instance_name, point_name, arr_of_attributes) {
// note: assumes the series are in order
var tables_for_each_instance = [];
$(subtree).find(instance_name).each( function() {
tables_for_each_instance.push( XMLAttributeTable( this, "point", arr_of_attributes ) );
});
return tables_for_each_instance;
}
function getROCSeriesForEachRanking(roc_subtree) {
return XMLAttributeTableCollection(roc_subtree, 'roc_series', 'point', ['index', 'target_groups', 'q_value']);
}
function getLikelihoodSeriesForEachRanking(likelihood_subtree) {
return XMLAttributeTableCollection(likelihood_subtree, 'likelihood_series', 'point', ['index', 'likelihood']);
}
这里有很多这样的函数,我不是很喜欢(感觉很难区分关注点)。我可能会因为尝试使用其他语言(如C++)的语义编写JavaScript而感到内疚,如果是这样的话,谢谢你的建议。但我无法摆脱有代码气味的感觉
所以我的问题是,JavaScript中的构造函数有什么好处?如果没有强类型或强制封装的实用选项,那么为什么要使用构造函数呢?在这种情况下,我似乎不知道如何使用成员函数来改善我的生活,所以“继承”似乎不是很有用
非常感谢您提供的任何建议 尽管JavaScript是动态的、弱类型的,而且使用操作符
new
似乎是Brendan Eich为了让语言看起来更像C和Java而投入的一种手段,而他真正想要的是一种类似Scheme的语言(请参阅此apochryphal故事的更多信息),您可以从构造器中获得一些优势:
XmlAttributeTable
,并且您在不使用new
的情况下将其作为函数调用,那么您正在创建任何东西就不太清楚了。也就是说,如果调用方法newTable
或createTable
或makeTable
,也可以Object.create
,则需要额外的代码行。这包括简化构造和让原型具有构造函数属性function Point(x, y) {
this.x = x
this.y = y
}
对
function makePoint(x, y) {
var point = Object.create(theProtoPointIDeclaredEarlier);
point.x = x;
point.y = y;
return this;
}
我已经读过好几次了,使用Object.create
应该比使用new
更可取,但我真的不认为操作符new
那么邪恶。我知道很多人可能不同意这一点,这没关系。Eich声称在10天的JavaScript设计中犯了一些“错误”(参见他在JSConf 2010上的主题演讲),但我从未听过他对构造函数感到遗憾
因此,构造函数风格的编码可能有助于提高可读性,尤其是在创建大量似乎属于同一类型的对象时。然而,这样的风格可能不适合你
对象的原型中。也可以创建
当您询问“代码气味”时,我可能不需要getter方法。现代JavaScript允许您使用get
属性创建属性,当您想要读取属性并执行代码时,该属性是干净的。IMHO比使用get
命名方法更好。此外,如果你的getter不仅仅是访问一个属性,你可以找到一个更好的名称。你在调用什么构造函数?有些函数只创建对象并返回它们。JavaScript中的构造器一词通常用于设计为使用新操作符调用的函数;它们隐式地创建并返回一个新对象,并使用this表达式初始化其属性。你是指那些类型的东西,还是指你使用它们的方式使用的函数?@RayToal正是我的问题——在这里使用构造函数有什么好处吗?它能帮助我分离关注点或更好地组织代码吗?@Oliver constructors允许原型设计和继承,但在我看来,你更想寻找一种清理命名空间的方法,所以我要说:对象可以有方法,函数可以是对象的属性。创建一个对象作为所有相关函数的域。@奥利弗JavaScript代码看起来像C++或java代码,使用对象文字而不是8个参数函数,它会使代码更可读。我理解你的沮丧,也许读一下Addy Osmani的《学习JavaScript设计模式》?Point
的两个版本都很愚蠢,如果你有x
和y
,并且想强调一点,明智的做法是{x:x,y:y}
接受这种语言:)我不反对points;这只是一个例子