我想为每个对象添加一个方法。
当我设置Object.prototype.somefunction = ...
时,当有人使用通常的模式枚举对象时,它会出现:
for (i in o){
if (o.hasOwnProperty(i)){
// do something with object
}
}
我试图将其设置在原型链的较高位置,但这是不可能的(至少在Chrome中不可能):
TypeError:无法设置未定义的属性'blah'
我可以在方法上设置一些标志或其他内容,以便它不会被枚举,就像本机方法不会一样吗? (或者至少让hasOwnProperty()
返回false
。)
更新:抱歉,我没有正确看待它。我正在使用ExtJS框架,我正在查看的对象已由Ext.apply()处理,它执行以下操作:
for(var p in c){
o[p] = c[p];
}
这就是“自有财产”标志丢失的地方。
所以我想我没有机会(在ECMAScript< 5中)将一个方法注入到一个行为类似于原生对象的对象中?
答案 0 :(得分:1)
我不确定我是否正确理解。完全针对这种情况需要hasOwnProperty
,并通过
for (i in o){
if (o.hasOwnProperty(i)){
// do something with object
}
}
不应包含Object.prototype
的方法。你能看到这种行为的例子吗?
我也不明白你的意思
我试着将它设置得更高 原型链
因为Object.prototype
是链的根,所以你不能得到任何更高的。
简而言之,解决方案正在按照您声称的方式完成。如果这不起作用,可能是你犯了错误或发现了一个错误。
答案 1 :(得分:1)
我不确定你的意思。如果方法/属性附加到原型,hasOwnProperty
将返回false。看到这段代码:
function Con(){this.enumerableProp = true;};
Con.prototype.fun = function(){return 'that\'s funny'};
var fun = new Con;
alert(fun.hasOwnProperty('fun')); //=> false
alert(fun.hasOwnProperty('enumerableProp')); //=> true
那么,你是什么意思?
答案 2 :(得分:0)
创建一个基类并使所有其他类扩展它。将方法添加到基类。
答案 3 :(得分:0)
ES5为此Object.getOwnPropertyNames()
:
Object.prototype.lolwat = 42;
var obj = {
'foo': 1,
'bar': 2
};
Object.getOwnPropertyNames(obj); // ['bar', 'foo']
要查看其支持位置:http://kangax.github.com/es5-compat-table/
但是,for-in
结合hasOwnProperty
检查也应该有效。
答案 4 :(得分:0)
你得到了这个错误,因为 原型链上没有任何东西。
值得注意的是,除非出于某种原因绝对必要,否则不建议添加到Object的原型
编辑:实际上,我的原始答案是不正确的 - 正如其他人所指出的那样,如果它在Object的原型中,那么你的对象应该不将它作为自己的属性。
在任何情况下,如果你想创建一个原型链(或者更重要的是,避免更改Object的原型),你将需要创建自己的类:
function MyBaseClass(){
}
MyBaseClass.prototype = new Object();
MyBaseClass.prototype.someMethod = function() { /* your method */ };
var o = new MyBaseClass();
o.hasOwnProperty('someMethod') //should be false