哪种方式最好定义我的方法。

时间:2015-09-02 15:00:53

标签: javascript object prototype

我的方法在Helper中

var Helper = {
    isEmpty: function (obj) {
        return !obj || obj === null || obj === undefined || Array.isArray(obj) && obj.length === 0;
    },
    pushArray: function (arr1, arr2) {
        if (arr1 && arr2 && Array.isArray(arr1)) {
            arr1.push.apply(arr1, Array.isArray(arr2) ? arr2 : [arr2]);
        }
    }
}

问题:所以,如果我有两个函数isEmpty(它要检查数组,字符串,对象)和pushArray,以下三个函数中的哪一个我应该用什么方法来定义那些函数?并且,有三种不同之处?

有三种方式(也许,还有其他方法。):

方式1:Array.prototype.someMethod = function(){ ... }

方式2:var Helper = {someMethod: function(){ ... }}

方式3:window.someMethod = function(){ ... }

我个人认为:

  • 不建议使用Way1。因为,它是ES(ecmascript)的对象,而不是我的。也许,您的方法将在未来由ES添加。
  • Way2是我通常使用它的方式。它是全球性的。还取决于你使用的地方
  • Way3是全球化的方式。此外,窗口不是我的对象。它不推荐

请详细解释。(另外,我没有找到这样的问题)先谢谢。

3 个答案:

答案 0 :(得分:1)

Way1通常建议不要使用,因为在未来版本的ecmascript中可能会引入相同的函数,然后将被覆盖。

Way3可以使用,但是你可以直接创建一个全局对象,如果我们拥有最少数量的全局变量,那么它就是好事。

我更喜欢使用Way2,我们将实用程序方法封装在整个应用程序的单个对象中。拥有单个入口点是一种很好的做法,您可以在其中创建层次结构。这允许您将所有自定义方法置于单个变量名下,并且不会直接在全局命名空间中将其作为单独的名称公开。

答案 1 :(得分:1)

因此,您已经提出了两个看起来主要用于处理数组的函数,但如果您传递的不是数组,它们应该返回智能结果。

所以,马上,你不能使用Array.prototype方法,因为如果数据不是数组,那么该方法就不会存在于对象中而你也不会得到您目前编码的行为。

因此,它真正归结为它们应该是您自己的全局对象上的全局函数还是命名空间函数。

如果有疑问,较少的全局符号通常是正确的答案,因为更多的全局符号使您更有可能与项目中可能包含的其他代码发生冲突。

我建议修改你的命名空间对象的实现:

var Helper = {
    isEmpty: function (obj) {
        return !obj || (Array.isArray(obj) && obj.length === 0);
    },
    pushArray: function (arr1, arr2) {
        if (Array.isArray(arr1)) {
            if (Array.isArray(arr2) {
               // push one array onto the end of the other
               arr1.push.apply(arr1, arr2);
            } else if (arr2 !== undefined) {
               // push a value onto the array
               arr1.push(arr2);
            }
        }
    }
}

isEmpty()中,我已删除了obj === null || obj === undefined支票,因为它们永远不会被点击,因为!obj已经抓住了这些支票。

pushArray()中,我已经将arr2中传递的假值(例如0)推送到您的代码不允许的数组中。

答案 2 :(得分:0)

  <hbox>
        <button>
          <input file>bbc_150x150.jpeg</input>
          <variable>bbc</variable>
          <action>txt0=$(eval rsstail -u newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml -u feeds.bbci.co.uk/news/system/latest_published_content/rss.xml -1 -n 1)</action>
      <action>echo $txt0</action>
      <action>refresh:txt0</action>
        </button>  
      </hbox>

      <hbox>
        <button>
          <input file>bbcbusiness_150x150.jpeg</input>
          <action>unset txt0</action>
          <action>txt0=$(eval rsstail -u newsrss.bbc.co.uk/rss/newsonline_uk_edition/business/rss.xml -1 -n 1)</action>
        <action>echo $txt0</action>
      <action>refresh:txt0</action>
        </button>  
      </hbox>
<vbox scrollable="true" width="600" height="300">
                <text wrap="false" xalign="0">
                    <variable>txt0</variable>
                    <label>This is a static text.</label>
                    <input file>txt0</input>
                </text>
            </vbox>

这使得所有数组现在都有Array.prototype.someMethod = function() { ... } 。这意味着,如果您有以下内容:

someMethod

它将打印:

  

0

     

1

     

的someMethod

这是因为,如前所述,属性var someArray = [ 1, 2 ]; for (var i in someArray) { console.log(i); } 已添加到所有数组中,现在必须使用someMethod过滤掉。请参阅jsBin here

someArray.hasOwnProperty(i)

这限制了仅使用var Helper = { someMethod: function() { ... } }; 调用someMethod的范围。

Helper.someMethod()

这使得window.someMethod = function() { ... }; 函数现在全局化。如果您或其他人覆盖someMethod函数,并且可能难以调试,则会产生无法预料的后果。