我试图在原型(prototype)对象上定义一个不可枚举的 toJSON
函数,但运气不佳。我希望得到类似于 ECMAScript 5 toJSON
的东西:
Object.defineProperty(obj, prop, { enumerable: false });
然而,这将它定义为一个不能作为方法访问的属性。
[编辑:尼克错了;它可以作为一种方法来访问。他的错误在于此问题中未显示的代码 - 有关详细信息,请参阅他对下面答案的评论。]
我希望能够以不可枚举的方式定义函数,因为我计划在所有基本类型的原型(prototype)中定义(String
,Number
、Boolean
、Array
和 Object
),以便我可以通过复杂对象递归应用该函数。
这里的最终目标是能够递归地对具有嵌套集合的 Backbone 模型/集合进行 JSONify。
我想我总共有两个主要问题:
- 是否可以在原型(prototype)上定义不可枚举的函数?如果是,如何?
- 是否有更好的方法对嵌套的 Backbone 模型进行 JSONify 化?
最佳答案
我不明白,为什么不能将其作为方法访问?
var foo = {};
Object.defineProperty(foo, 'bar', {
enumerable: false,
value: function () {console.log('foo.bar\'d!');}
});
foo.bar(); // foo.bar'd!
如果你想在原型(prototype)上使用它,很简单
Object.defineProperty(foo.prototype, /* etc */);
甚至直接在 Object.create
中
foo.prototype = Object.create(null, {
'bar': {value: function () {/* ... */}}
});
但是,除非您正在创建 foo
的实例,否则如果您尝试 foo.bar
,它不会显示,并且仅显示为 foo.prototype.bar
。
如果 foo
有它自己的原型(prototype)(例如 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 .
关于javascript - JS不可枚举函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438595/