我正在探索一些代码,我看到了将一个构造函数嵌入到另一个构造函数中的做法多次使用:
/**
* @constructor
*/
function contact_duplicates_manager(global_objects)
{
this.field_processors =
{
"Phone1Number": new phone_processor(),
"Phone2Number": new phone_processor(),
"Phone3Number": new phone_processor()
}
//...here some other code
/**
* @constructor
*/
function phone_processor()
{
//...here some other code
function clear_phone(phone)
{
//...here some code
}
this.is_equals = function (value1, value2)
{
return is_equals(clear_phone(value1), clear_phone(value2));
}
}
}
//... later in the code
var valid = this.field_processors[fld_name]["is_equals"](native_value, custom_value)
您认为phone_processor
构造函数应该在contact_duplicates_manager
之外吗?
答案 0 :(得分:2)
您认为
phone_processor
函数构造函数应该在contact_duplicates_manager
之外吗?
是。虽然有效和有效,但它效率低,可能不可读。通过嵌套,每个contact_duplicates_manager
实例都具有phone_processor
个不同的构造函数,并从不同的原型对象继承。这可能是构造工厂或类似模式所必需的,但这些非常罕见,我怀疑你在这里需要它。
我的经验法则:
- 将不需要访问任何本地闭包变量的每个函数移动到更高的范围。
- 如果您不希望它在那里公开,请使用IEFE的中间范围。
- 如果您需要在多次执行函数范围内的构造函数,请尝试在构造函数之间共享原型对象,并且不要泄漏本地构造函数。
最后一条规则的示例:
function Item(…) {…}
function Store {
var that = this;
this.items = [];
this.addItem = function(…) {
that.items.push(new LocalItem(…));
};
function LocalItem(…) {
Item.call(this, …);
this.store = that;
}
LocalItem.prototype = Item.prototype;
}
您不一定需要您称为继承的全局Item
函数,有时可以将一个全局proto
对象分配给LocalConstructor.prototype
就足够了。