JS 不可枚举函数

2024-01-07

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

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

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

我希望能够以不可枚举的方式定义该函数,正如我计划在所有原始类型的原型中定义的那样(String, Number, Boolean, Array, and Object),这样我就可以通过复杂的对象递归地应用该函数。

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

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

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

我不明白,为什么不能将其作为方法访问?

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 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

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

但是,除非您要创建foo, it won't如果你尝试出现foo.bar,并且仅可见foo.prototype.bar.

If foo有自己的原型(例如foo = Object.create({})),你可以得到它Object.getPrototypeOf https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf,将属性添加到其中,然后foo.bar即使它不是一个实例也会起作用。

var proto = Object.getPrototypeOf(foo); // get prototype
Object.defineProperty(proto, /* etc */);

你可以看到可枚举属性与不可枚举属性的可见性here https://developer.mozilla.org/en-US/docs/Enumerability_and_ownership_of_properties#Detection_Table.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS 不可枚举函数 的相关文章