从枚举中隐藏方法

时间:2011-03-29 10:51:11

标签: javascript extjs

我想为每个对象添加一个方法。

当我设置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中)将一个方法注入到一个行为类似于原生对象的对象中?

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