【问题标题】:constructor inside constructor - bad practice?构造函数内的构造函数 - 不好的做法?
【发布时间】:2013-12-26 11:47:16
【问题描述】:

我正在探索一些代码,我看到了将一个构造函数嵌入到另一个构造函数中多次使用的做法:

/**
 * @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之外吗?

【问题讨论】:

  • 一开始我会写成可读的格式(Java风格)。
  • phone_processor()到底是怎么用的?
  • 这只是function 中的function,它没有任何错误。在我看来,封装仅在父函数中使用的代码是一种很好的做法。
  • @nnnnnn,我已经更新了示例以演示它的使用方式。

标签: javascript


【解决方案1】:

你认为phone_processor函数构造函数应该在contact_duplicates_manager之外吗?

是的。虽然有效且有效,但它效率不高且可能不可读。通过嵌套,每个contact_duplicates_manager 实例都有phone_processors,具有不同的构造函数并从不同的原型对象继承。这对于构造函数工厂或类似模式可能是必需的,但这些非常罕见,我怀疑您在这里需要它。

我的经验法则:

  • 将不需要访问任何局部闭包变量的每个函数移到更高的范围。
  • 如果您不希望它在那里公开,请使用 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 函数,有时您可以分配给 LocalConstructor.prototype 的单个全局 proto 对象就足够了。

【讨论】:

    猜你喜欢
    • 2012-06-30
    • 2013-03-31
    • 2014-08-15
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多