【问题标题】:Javascript function reference best practicesJavascript 函数参考最佳实践
【发布时间】:2013-03-10 20:26:42
【问题描述】:
function name( elements ){

    init( elements );

    var ret = {
        add : function( more ){
            $.extend(elements, more);
            init( more );
        }
    }

    function init( el ){
        $.each(el,function(name, selector){
            //some stuff....
        });
    }

    return ret;
}

我非常使用这种结构(我自己创建的)......在不使用对象的情况下做这样的想法非常简单和好:

var reference = name({ one : $('#one'), two : $('#two') });

//and in a second moment...
reverence.add({ three : $('#tree') });

这是一个好的做法还是不是?使用物体和距离更好吗?为什么?

【问题讨论】:

  • 这个对象结构有什么问题?顺便说一句,似乎无法再次访问elements

标签: javascript prototype javascript-objects


【解决方案1】:

在我看来,构造函数和原型(JavaScript 相当于传统的类)导致代码更具可读性和可维护性。我必须将您的示例阅读三遍才能弄清楚它在做什么(基本上,使用“添加”方法创建字典结构)。

原型更接近于 javascript,并使用一种常见且众所周知的范式——对其他人或两年后的你来说更容易回顾和理解。

考虑以下内容的阅读难度:

/** @constructor */
function Name(elememts) {
    this.elements = this._init(elements)
}

Name.prototype.add = function(more) {
    $.extend(this.elements, this._init(more));
}

Name.prototype._init = function(elements) {
    // some stuff...
}

您的方法确实具有隐藏私有函数的优势。对于传统的原型继承,没有“private”关键字,因此您要记住不要从对象本身外部调用私有方法。 (Google 的 Closure Compiler 确实有一个 @private 注释,它会帮助您执行它,但它并不是一个完美的系统。)

【讨论】:

    【解决方案2】:

    我建议你使用闭包……它们在 javascript 中是很强大的东西……:)

    var status = function (status) {
    return {
    get_status: function ( ) {
    return status;
    }
    };
    };
    
    // Make an instance of status.
        var myStatus = status("amazed");
        document.writeln(myStatus.get_status( ));
    

    【讨论】:

    • 这不正是 OP 正在做的事情吗?
    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多