JS非枚举函数

Nic*_*son 8 javascript backbone.js

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

Object.defineProperty(obj, prop, { enumerable: false });
Run Code Online (Sandbox Code Playgroud)

但是,这将其定义为无法作为方法访问的属性.

我希望能在一个不可枚举的方式来定义函数,因为我打算在所有基本类型(的原型定义String,Number,Boolean,Array,和Object),这样我就可以递归地处理复杂的对象应用的功能.

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

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

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

Pau*_* S. 16

我不明白,为什么你不能把它当作一种方法来访问它?

var foo = {};

Object.defineProperty(foo, 'bar', {
    enumerable: false,
    value: function () {console.log('foo.bar\'d!');}
});

foo.bar(); // foo.bar'd!
Run Code Online (Sandbox Code Playgroud)

如果你想在原型上使用它,就像它一样简单

Object.defineProperty(foo.prototype, /* etc */);
Run Code Online (Sandbox Code Playgroud)

甚至直接在 Object.create

foo.prototype = Object.create(null, {
    'bar': {value: function () {/* ... */}}
});
Run Code Online (Sandbox Code Playgroud)

但是,除非您正在创建实例,否则如果您尝试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 */);
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看可枚举与不可枚举属性的可见性.