哪些方式最适合定义我的方法。

Which ways are best to define my method.

我的方法在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,我应该使用以下三种方法中的哪一种来定义该功能?并且,三种方式有什么区别?

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

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

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

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

个人认为:

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

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

方法 3 可以使用,但是你直接创建一个全局对象,作为一个好的做法,如果我们有最少数量的全局变量,它是好的。

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

Array.prototype.someMethod = function() { ... }

这使得 所有 个数组现在有 someMethod。这意味着如果您有以下条件:

var someArray = [ 1, 2 ];
for (var i in someArray) {
   console.log(i);
}

它将打印:

0

1

someMethod

这是因为如前所述,属性someMethod已经添加到所有数组中,现在必须用[=过滤掉16=]。见 jsBin here.

var Helper = { someMethod: function() { ... } };

这限制了 someMethod 的范围只能用 Helper.someMethod() 调用。

window.someMethod = function() { ... };

这使得 someMethod 函数现在成为全局函数。如果您或其他人覆盖 someMethod 函数,这可能会产生无法预料的后果,并且可能难以调试。

因此,您提出了两个看起来主要设计用于处理数组的函数,但如果您向它们传递数组以外的其他内容,它们应该 return 智能结果。

所以,您现在不能使用 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)推入您的代码不允许的数组中。