我正在尝试在原型对象上定义一个不可枚举的toJSON
函数而没有太多运气。我希望有类似于ECMAScript 5的toJSON
:
Object.defineProperty(obj, prop, { enumerable: false });
然而,这将其定义为无法作为方法访问的属性。
我希望能够以不可枚举的方式定义函数,因为我计划在所有原始类型的原型中定义(String
,Number
,{{1} },Boolean
和Array
),以便我可以通过复杂对象递归地应用函数。
这里的最终目标是能够递归地使用嵌套集合JSONify Backbone模型/集合。
我想我总共有两个主要问题:
答案 0 :(得分:15)
我不懂,为什么你不能把它作为一种方法来访问?
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。
答案 1 :(得分:1)
Paul S.是正确的,需要设置属性定义value
而不是get
,但我想补充一点,你不需要传递enumerable: false
,因为false是Object.defineProperty()
中该选项的默认值。答案可以简化为:
var foo = {};
Object.defineProperty(foo, 'bar', {
value: function(){ console.log('calling bar!'); }
});
foo.bar();
答案 2 :(得分:0)
循环遍历对象时,始终可以避免在对象中使用可数函数属性。而且,除了在每个对象中定义属性并将enumberable设置为false之外,您还可以创建函数,该函数将调用具有所需属性的任何对象,并设置条件以使该属性不进入循环列表。这是示例:
non-protected