javascript - JS不可枚举函数

标签 javascript backbone.js

我试图在原型(prototype)对象上定义一个不可枚举的 toJSON 函数,但运气不佳。我希望得到类似于 ECMAScript 5 toJSON 的东西:

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

然而,这将它定义为一个不能作为方法访问的属性。
[编辑:尼克错了;它可以作为一种方法来访问。他的错误在于此问题中未显示的代码 - 有关详细信息,请参阅他对下面答案的评论。]

我希望能够以不可枚举的方式定义函数,因为我计划在所有基本类型的原型(prototype)中定义(StringNumberBooleanArrayObject),以便我可以通过复杂对象递归应用该函数。

这里的最终目标是能够递归地对具有嵌套集合的 Backbone 模型/集合进行 JSONify。

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

  1. 是否可以在原型(prototype)上定义不可枚举的函数?如果是,如何?
  2. 是否有更好的方法对嵌套的 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/

相关文章:

javascript - 由于文档的点击事件,angularjs 多选下拉菜单使页面变得沉重

javascript - IE 删除使用 javascript 创建的选项标签

javascript - 具有 2 种模式的 html 输入模式

javascript - 如何在 Chrome Developer 中查看 DOM 对象的属性?

javascript - Backbonejs 和 defaultRoute

javascript - 使用 Bacon.js 在容器中列出

javascript - 如何更改所选链接的背景?

javascript - 主干集合获取渲染在第一次加载时使用路由器运行两次

backbone.js - 如何使用 requirejs 加载环境特定配置?

javascript - backbone.js 事件未绑定(bind)到文本区域上的触发操作