【问题标题】:How to get the functionality of Object/Array .prototype without using prototype?如何在不使用原型的情况下获得 Object/Array .prototype 的功能?
【发布时间】:2014-04-21 18:06:08
【问题描述】:

好的,所以我用一个愚蠢的举动阻止了自己,这导致与我正在使用的 jQuery 库发生冲突,而且我应该说,在我完成阅读之后,它可能会破坏更多。无论如何,我试图使用以下位:

Array.prototype.contains = function(v) {
    for(var i = 0; i < this.length; i++) {
        if(this[i] === v) return true;
    }
    return false;
};

Array.prototype.unique = function() {
    var arr = [];
    for(var i = 0; i < this.length; i++) {
        if(!arr.contains(this[i])) {
            arr.push(this[i]);
        }
    }
    return arr;
}

然而,为了获得数组的唯一值,这最终导致了 jQuery 的冲突,因为我的原因破坏了很多东西,那么我该如何绕过使用原型的被禁止但美味的想法呢?特别是在这种需要数组中唯一值的情况下?

【问题讨论】:

  • 可以使用Underscore之类的库吗?
  • 这是一种更简化的方法 - 为什么不将原型方法的名称更改为“hascontent”或“isunique”之类的名称?
  • 以什么方式发生冲突?你有错误吗?你有例子吗?
  • jQuery 不会修改任何内置原型。所以这段代码不应该和它冲突。您正在观察的具体问题是什么?
  • 如果你在一个数组上使用for-in,那可能会破坏事情。但这与 jQuery 无关。这与不知道如何正确迭代数组有关。

标签: javascript jquery arrays prototype


【解决方案1】:

避免修改原生类型原型的常用方法是静态方法:

Array.unique = function( entity ) {
    // do your stuff
};

// example call
var unique = Array.unique( [1, 1, 2, 3] );

或者,更进一步,甚至做这样的事情

var Arrays = Arrays || {};
Arrays.unique = function( entity ) { /* … */ };

这样你就和内置的Array完全分开了。

【讨论】:

  • 内置构造函数上的“静态”方法也可能与其他代码冲突。
  • @cookiemonster 我添加了一些细微的变化(无论如何我更喜欢)。
  • 确保安全的唯一真正方法是在包含其余代码的函数中声明它。如果它是全球性的,您可能会遇到同样的问题。虽然我不知道 OP 一开始在谈论什么冲突。
  • ...最终,唯一真正的解决方案是准确了解加载的每一段代码如何影响环境,如果它以不合需要的方式影响它,请不要加载它。跨度>
  • 如果你的某个库已经定义了Arrays,你应该知道它。如果没有,就不应该有任何干扰。最终你可以把这个论点反对一切——在某些时候你需要 some 全局可用的名称,即使你将整个应用程序封装到一个模块中……从理论上讲,这可能会产生干扰。所以我看到了使用内置插件做任何事情时的危险,但使用Arrays 确实应该足够安全。
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
相关资源
最近更新 更多