JS不可枚举函数
JS non-enumerable function
我正试图在原型对象上定义一个不可枚举的toJSON
函数,但运气并不好。我希望得到类似ECMAScript 5 toJSON
:的东西
Object.defineProperty(obj, prop, { enumerable: false });
然而,这将它定义为一个不能作为方法访问的属性
[编辑:Nick错了;它可以作为一种方法访问。他的错误是在这个问题中没有显示的代码中-有关详细信息,请参阅他对下面答案的评论。]
我希望能够以不可枚举的方式定义函数,因为我计划在所有基元类型(String
、Number
、Boolean
、Array
和Object
)的原型中进行定义,这样我就可以通过复杂对象递归地应用函数。
这里的最终目标是能够递归地JSONify具有嵌套集合的主干模型/集合。
我想我总共有两个主要问题:
- 有可能在原型上定义一个不可枚举的函数吗?如果是,怎么办
- 有没有更好的方法来实现JSONify嵌套的主干模型
我不明白,为什么你不能把它作为一个方法访问?
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
中
foo.prototype = Object.create(null, {
'bar': {value: function () {/* ... */}}
});
但是,除非您正在创建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 */);
您可以在此处查看可枚举属性与不可枚举属性的可见性。
value
而不是get
是正确的,但我想补充一点,您不需要通过enumerable: false
,因为在Object.defineProperty()
中该选项的默认值为false。答案可以简化为:
var foo = {};
Object.defineProperty(foo, 'bar', {
value: function(){ console.log('calling bar!'); }
});
foo.bar();
当你循环遍历对象时,你总是可以避免在对象中使用可枚举函数属性。你可以创建一个函数,它将调用任何具有你想要的属性的对象,并设置一个不在循环列表中使用该属性的条件,而不是在每个对象中定义属性并将可枚举设置为false。这是一个例子:
const obj = {
name: "myName",
title: "developer"
}
function prop() {
this.loop = function(i) {
for (i in this) {
if (typeof(this[i]) == "function") {
continue;
} else {
console.log(this[i]);
}
}
}
}
prop.call(obj);
obj.loop();
output >> myName, developer
相关文章:
- 不可枚举的属性出现在 for..在 Chrome 中循环
- 为什么ES6 WeakMap's不可枚举
- Javascript不可枚举属性
- 为什么在枚举属性/函数时键长度不准确
- 遍历所有不可枚举属性的任意方法
- 枚举窗口对象时不存在转义函数
- 如何将 Typescript 枚举的值添加到我的 JavaScript 函数中
- 使 Node.js 流信息不可枚举
- JavaScript,定义不可修改的枚举
- Javascript MDN 函数原型绑定 polyfill 在数组中是可枚举的
- javascript defineProperty 使属性不可枚举
- 对不可枚举属性进行迭代
- 为什么我可以设置不可确定属性描述符的[可枚举性和]可写性
- 如何在IE8的JavaScript中添加不可枚举属性
- JS不可枚举函数
- 是否可以模拟不可枚举的属性
- 扩展具有不可枚举属性的对象
- 可以在javascript构造函数中声明不可枚举的属性吗?
- 使属性不可枚举有什么好处
- 在 javascript 中克隆不可枚举的属性