2013-03-10 118 views
0
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; 
} 

我用这个结构(我已经通过自己创建)非常多......这是非常简单好做的认为这样不使用对象:JavaScript函数参考的最佳实践

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

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

这是一种好的做法,还是不是?使用对象和空间会更好吗?为什么?

+0

这个目标结构会有什么问题?顺便说一句,似乎没有办法再次访问'元素'。 – Bergi 2013-03-10 21:05:28

回答

1

在我看来,构造函数和原型(JavaScript等价于传统类)导致更易读和可维护的代码。我不得不三次读取你的例子,找出它在做什么(基本上,用'add'方法创建一个字典结构)。

原型更多的是javascript-y,并且使用一个常见而且众所周知的范例 - 对其他人来说要简单得多,或者从现在开始两年后再回顾并理解。

考虑以下多么容易是阅读:

/** @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... 
} 

你的方法确实得到隐藏私人功能的优势。对于传统的原型继承,没有“私有”关键字,所以您应该记住不要从对象本身之外调用私有方法。 (谷歌的Closure编译器确实有一个@private注释,它会帮助你执行它,但它不完全是一个完美的系统。)

0

我建议你使用闭包......它们是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()); 
+0

这不正是OP在做什么? – Bergi 2013-03-10 21:06:33