代码之家  ›  专栏  ›  技术社区  ›  Ben Lesh

javascript中的原型对象是否破坏jquery?

  •  35
  • Ben Lesh  · 技术社区  · 15 年前

    我添加了一个简单的 .js 文件到我的页面,其中添加了一些非常普通的常见任务类型的函数 Object Array 原型。

    经过反复试验,我发现在 Object.prototype ,无论它的名称或它做什么都会导致jquery中的javascript错误:

    罪魁祸首?

    Object.prototype.foo = function() {
        /*do nothing and break jQuery*/
    };
    

    我得到第1056行的错误 jquery-1.3.2.js ,在attr:函数声明中:

    /*Object doesn't support this property or method*/
    name = name.replace(/-([a-z])/ig, function(all, letter) {
                return letter.toUpperCase();
            });
    

    显然g.replace未定义。

    很明显,有一些东西我只是没有用原型设计来包装我的头,但我很不幸地没能弄清楚它是什么。

    明确地说,我不是在找解决办法,我已经处理好了……我要找的是一个答案 为什么? . 为什么要将函数添加到 对象.原型 打破这段代码?

    5 回复  |  直到 9 年前
        1
  •  20
  •   Shashank Agrawal    9 年前

    你不应该延长 Object.prototype . 它远不止破坏jquery;它完全破坏了javascript的“对象作为哈希表”功能。不要这样做。

    你可以问约翰·雷西格,他会告诉你 same thing .

        2
  •  41
  •   nicholas    14 年前

    如果这只是一个在循环中混乱…的情况,那么您不能使用object.defineproperty添加您的fn而不使其可枚举吗?

    所以:

    Object.defineProperty(Object.prototype, "foo", { 
        value: function() {
            // do stuff
        },
        enumerable : false
    });
    

    似乎对我有用。这还会被认为是不好的形式吗?

        3
  •  5
  •   sth    15 年前

    我同意,在 Object.prototype 要求谨慎,应避免。寻找其他解决方案,如:

    将其添加到对象,然后使用 call apply ,根据需要。 例如:

    Object.foo = function () { return this.whatever()}
    

    然后通过以下方式在对象上调用它:

    Object.foo.call(Objname);  // this invokes the function as though it were a
                               // method of Objname.  That is, its like Objname.foo()
    

    为了好玩,你可以添加以下内容(是的,我知道这有点危险…):

    Function.using = Function.call; // syntactic sugar
    

    现在你可以写了 Object.foo.using(Objname) 它读起来像一个哨兵。

    但通常情况下,不要改变任何大型原型。

        4
  •  1
  •   Miguel    9 年前

    我在这个问题上绞尽脑汁,因为我希望在所有对象中实现“真实”的对象方向,如:

    interface Object
    {
        GetType: () => string;
        ToString: () => string;
        GetHashcode: () => number;
        Equals: (obj: any) => boolean;
    }
    

    由于object.prototype破坏了jquery,所以我默认使用上面提到的解决方案来使用defineproperty,但不接受任何参数。

    好消息是,您可以侵入定义属性并实际接受参数。以下是我的实现:

    Object.defineProperty(Object.prototype, "Equals",
        {
            value: function (obj: any)
            {
                return obj == null && this == null
                        ? true
                        : obj != null && this == null
                            ? false
                            : obj == null && this != null
                                ? false
                                : this.GetHashcode() == obj.GetHashcode();
            },
            enumerable: false
        });
    

    这可以工作,并且不会与jquery冲突。

        5
  •  -1
  •   jshalvi    15 年前

    我怀疑向object.prototype添加函数会直接破坏jquery。只需确保您在整个站点中的..in循环中的每个函数都包含在一个hasownproperty检查中,因为您已经全局添加了函数,并且迭代它的结果可能是不可预测的:

    Object.prototype.foo = function() {};    
    var myObject = {m1: "one", m2: "two" };
    
    for(var i in myObject) { if(myObject.hasOwnProperty(i)) {
       // Do stuff... but not to Object.prototype.foo
    }}