JS非枚举函数

时间:2013-07-03 02:04:54

标签: javascript backbone.js

我正在尝试在原型对象上定义一个不可枚举的toJSON函数而没有太多运气。我希望有类似于ECMAScript 5的toJSON

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

然而,这将其定义为无法作为方法访问的属性。

我希望能够以不可枚举的方式定义函数,因为我计划在所有原始类型的原型中定义(StringNumber,{{1} },BooleanArray),以便我可以通过复杂对象递归地应用函数。

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

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

  1. 是否可以在原型上定义不可枚举的函数?如果是这样的话?
  2. JSONify嵌套Backbone模型有更好的方法吗?

3 个答案:

答案 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