我试图在原型对象上定义一个不可枚举的toJSON
函数,但没有太多的运气。我希望得到类似于ECMAScript 5 toJSON
的东西:
Object.defineProperty(obj, prop, { enumerable: false });
但是,这将其定义为不能作为方法访问的属性。
[EDIT:Nick是错误的;它 * 可以 * 作为一个方法访问。他的错误是在这个问题中没有显示的代码中-有关详细信息,请参见他对下面答案的评论。]
我希望能够以不可枚举的方式定义函数,就像我计划在所有基元类型(String
、Number
、Boolean
、Array
和Object
)的原型中定义的那样,这样我就可以通过复杂对象递归地应用函数。
这里的最终目标是能够递归地对具有嵌套集合的 Backbone.js 模型/集合进行JSON化。
我想总的来说我有两个主要问题:
1.是否可以在原型上定义一个非枚举函数?如果可以,如何定义?
1.有没有更好的方法来JSONify嵌套的 Backbone.js 模型?
3条答案
按热度按时间emeijp431#
我不明白,为什么你不能把它作为一个方法来访问呢?
如果你想在原型上使用它,就像
或者甚至直接在
Object.create
中然而,除非你创建
foo
的示例,否则如果你尝试foo.bar
,它不会显示出来,并且只能以foo.prototype.bar
的形式显示。如果
foo
有它自己的原型(例如foo = Object.create({})
),你可以用Object.getPrototypeOf
得到它,向它添加属性,那么foo.bar
即使不是一个示例也可以工作。您可以在此处查看可枚举属性与不可枚举属性的可见性。
nwlqm0z12#
Paul S.关于需要设置属性定义的
value
而不是get
的说法是正确的,但我想补充的是,您不需要传递enumerable: false
,因为Object.defineProperty()
中该选项的默认值为false。答案可以简化为:46qrfjad3#
当你循环遍历对象时,你总是可以避免在对象中使用可枚举函数属性。你可以创建一个函数,它将调用任何具有你想要的属性的对象,并在循环列表中设置一个不接受该属性的条件,而不是在每个对象中定义属性并将可枚举设置为false。下面是一个例子: