我添加了一个简单的.js文件到我的网页,有一些很平凡的共同任务排序的加入ObjectArray原型功能。

经过反复试验,我已经想通了,添加任何功能Object.prototype,无论它的名字还是它做什么jQuery中导致Javascript错误:

罪魁祸首?

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

在错误我得到jquery-1.3.2.js的线1056,在ATTR:函数{}声明:

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

显然G.replace未定义。

虽然很明显,有什么东西,我只是不与原型周围包裹我的头,我没有草草收场,以弄清楚它是什么。

需要明确的是,我不是在寻找一个解决办法,我有处理......我要找的是一个答案为为什么?。为什么添加一个函数来Object.prototype打破这个代码位?

有帮助吗?

解决方案

您永远不应该延长Object.prototype。它远远超过打破jQuery的;它完全打破了使用Javascript的“目标为,散列表”功能。不这样做。

您可以问约翰Resig的,他会告诉你的同样的事情

其他提示

如果它只是在循环搞乱了......的情况下,你不能使用Object.defineProperty添加您的FN没有使它可枚举?

所以:

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

似乎为我工作。请问这仍然被认为是不好的形式?

我同意,加入东西Object.prototype需求小心,应该避免。寻找其他解决方案,例如:

添加它到对象,然后用callapply访问它,根据需要。 例如:

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)和它读取像森泰斯。

不过,按照惯例,从改变任何大原型望而却步。

我撞了我解决这个问题的头,我想实现我的所有对象的“真实”的面向对象,像这样的:

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

由于Object.prototype中打破JQuery的,我默认为上述溶液利用defineProperty的,但这并不采取任何参数。

好消息是,你可以侵入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的冲突。

我疑惑加入Object.prototype中的函数直接打破jQuery的。只要确保每一个for..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
}}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top