backbone.js JS不可枚举函数

jaxagkaj  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(177)

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

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

但是,这将其定义为不能作为方法访问的属性。
[EDIT:Nick是错误的;它 * 可以 * 作为一个方法访问。他的错误是在这个问题中没有显示的代码中-有关详细信息,请参见他对下面答案的评论。]
我希望能够以不可枚举的方式定义函数,就像我计划在所有基元类型(StringNumberBooleanArrayObject)的原型中定义的那样,这样我就可以通过复杂对象递归地应用函数。
这里的最终目标是能够递归地对具有嵌套集合的 Backbone.js 模型/集合进行JSON化。
我想总的来说我有两个主要问题:
1.是否可以在原型上定义一个非枚举函数?如果可以,如何定义?
1.有没有更好的方法来JSONify嵌套的 Backbone.js 模型?

emeijp43

emeijp431#

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

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 */);

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

nwlqm0z1

nwlqm0z12#

Paul S.关于需要设置属性定义的value而不是get的说法是正确的,但我想补充的是,您不需要传递enumerable: false,因为Object.defineProperty()中该选项的默认值为false。答案可以简化为:

var foo = {};    

Object.defineProperty(foo, 'bar', {
    value: function(){ console.log('calling bar!'); }
});

foo.bar();
46qrfjad

46qrfjad3#

当你循环遍历对象时,你总是可以避免在对象中使用可枚举函数属性。你可以创建一个函数,它将调用任何具有你想要的属性的对象,并在循环列表中设置一个不接受该属性的条件,而不是在每个对象中定义属性并将可枚举设置为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

相关问题