2013-07-03 47 views
5

我试图在原型对象上定义一个不可枚举的toJSON函数,但没有多少运气。我希望类似的在ECMAScript 5 toJSON东西:JS非枚举函数

Object.defineProperty(obj, prop, { enumerable: false }); 

然而,这把它定义为不能作为一种方法来访问属性。

我希望能在一个不可枚举的方式来定义函数,因为我打算在所有基本类型的原型定义(StringNumberBooleanArrayObject),让我可以通过复杂对象递归地应用函数。

这里的最终目标是能够递归地嵌套集合JSON化Backbone模型/集合。

我总想我有两个主要问题:

  1. 是否有可能定义一个原型不可枚举的功能?如果是这样如何?
  2. 有没有更好的方法来JSONify嵌套骨干模型?
+0

根据定义*的方法是对象的属性。你正在绘制一个不存在的区别。如果你希望它是非枚举的,那么很显然你正在枚举一个对象的属性。 –

+0

是的,但是我希望它是一个非枚举属性,就像Object.defineProperty是不可枚举一样。即,在使用'for(x in obj)'时不会迭代通过' –

+0

Right。同样,方法是引用函数的对象的属性。你拥有的代码就是你用来使属性不可枚举的东西。 –

回答

13

我不明白,为什么你不能作为一种方法访问它?

var foo = {}; 

Object.defineProperty(foo, 'bar', { 
    enumerable: false, 
    value: function() {console.log('foo.bar\'d!');} 
}); 

foo.bar(); // foo.bar'd! 

如果你想它的原型,它是那么容易,因为

Object.defineProperty(foo.prototype, /* etc */); 

甚至直接在Object.create

foo.prototype = Object.create(null, { 
    'bar': {value: function() {/* ... */}} 
}); 

但是,除非你正在创建的foo情况下, 将不会显示,如果您尝试foo.bar,并只显示为foo.prototype.bar

如果foo有它自己的原型(例如foo = Object.create({})),你可以用Object.getPrototypeOf得到它的属性添加到,然后foo.bar会工作,即使它不是一个实例。

var proto = Object.getPrototypeOf(foo); // get prototype 
Object.defineProperty(proto, /* etc */); 

你可以看到visibility of enumerable vs non-enumerable properties here

+0

太棒了,谢谢!问题在于我使用'get'而不是'value',这是我无法作为函数访问的。 –

+0

_get_在不传递任何参数的情况下调用_function_,然后假装该属性等于函数的'return',所以当您想要执行'SJON(args)'时,您正在执行'SJON()(args)' –

+0

好。最后一个问题,如果你不介意的话;这种方法是否会导致与使用枚举函数扩展Object原型相同的问题? –

1

保罗S.是正确的约需要设置属性定义的value,而不是一个get,但我想补充一点,你不需要通过enumerable: false,因为假的是Object.defineProperty()答案可以该选项的默认简化为:

var foo = {};  

Object.defineProperty(foo, 'bar', { 
    value: function(){ console.log('calling bar!'); } 
}); 

foo.bar(); 
+0

谢谢,我只是明确地在问题中明确指出了这一点,但它确实不是必需的。 –