【问题标题】:Which ways are best to define my method.哪种方法最好定义我的方法。
【发布时间】:2015-09-02 15:00:52
【问题描述】:

我的方法在 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(){ ... }}

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

个人认为:

  • 不推荐使用方式 1。因为,它是 ES(ecmascript) 的对象,而不是我的。也许,你的方法将来会被 ES 添加。
  • Way2 是我通常使用的方式。它是全球性的。也取决于你在哪里使用
  • Way3 是全局方式。另外,窗口不是我的对象。不推荐

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

【问题讨论】:

  • 使用哪个取决于您的要求以及您将如何使用函数/方法。根据需要,这三个中的每一个都有案例。所以,基本上这个问题没有包含足够的信息来根据某些特定的上下文来回答。
  • 这些答案并不能真正回答问题,因为您的一般问题没有答案。这完全取决于情况,您没有描述情况。有时向 Array 原型添加方法是合适的。有时定义一个新的全局函数是合适的。有时将方法放在对象上是合适的。使用哪个取决于具体情况,这个问题过于宽泛,无法要求我们解释所有可能情况下的所有可能答案。
  • 您可以改进您的问题并描述特定情况,然后我们可以针对该情况提供非常具体的答案。这是学习如何在 StackOverflow 上提出好的、清晰和具体的问题的一部分。
  • 这个问题就像是说我应该开车、步行、骑车还是飞到我的目的地?嗯,答案是这取决于情况的一大堆方面,比如距离有多远,你有多少时间,你是否想锻炼,你能花多少钱,它是哪个社区,你的身体能力等...每个可能的答案在某些情况下都是适当的。

标签: javascript object prototype


【解决方案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)推入您的代码不允许的数组中。

【讨论】:

  • 谢谢。做得好。如果我使用Helper.pushArray(arr, null) 会出错。 obj 是否等于 null || undefined || ""false(我忘了任何案例吗)。
  • @SheraliTurdiyev - 我的代码测试以查看 arr2 是否实际上作为参数传递,如果是,则将传递的任何内容推入数组。 null 是数组中的一个有效值,就像"" 一样,所以我假设如果调用者通过了这些值,那么这就是他们在数组中想要的。如果您想排除某些值被推送到数组中,您将不得不测试您想要排除的任何特定值 - 这不是我能知道的,因为这是您的情况。
【解决方案2】:

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

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

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

【讨论】:

  • Tarang 你正确理解了我的问题。另外,我知道你的建议。但是,我对此表示怀疑。我想知道确切的
  • 所以没有方法是错误的,它只是实现功能的好方法或坏方法。
  • 所有三种定义函数的方法都在良好的 Javascript 实践中占有一席之地。使用哪个完全取决于 OP 没有具体说明的情况,因此很难提出任何单一的建议。
【解决方案3】:
Array.prototype.someMethod = function() { ... }

这使得 所有 数组现在都有someMethod。这意味着,如果您有以下情况:

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

它将打印:

0

1

一些方法

这是因为,如前所述,属性someMethod 已添加到所有 数组中,现在必须使用someArray.hasOwnProperty(i) 过滤掉。请参阅jsBin here

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2011-02-26
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多