在Javascript原型对象打破jQuery的?
-
11-09-2019 - |
题
我添加了一个简单的.js
文件到我的网页,有一些很平凡的共同任务排序的加入Object
和Array
原型功能。
经过反复试验,我已经想通了,添加任何功能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
需求小心,应该避免。寻找其他解决方案,例如:
添加它到对象,然后用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)
和它读取像森泰斯。
不过,按照惯例,从改变任何大原型望而却步。
我撞了我解决这个问题的头,我想实现我的所有对象的“真实”的面向对象,像这样的:
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
}}