Javascript 敲除如何隐藏对象属性
我不熟悉knockout.js,但我的速度很快。有一件事我真的很沮丧,那就是如果我做了Javascript 敲除如何隐藏对象属性,javascript,knockout.js,Javascript,Knockout.js,我不熟悉knockout.js,但我的速度很快。有一件事我真的很沮丧,那就是如果我做了JSON.stringify(koModel)我得到空对象{} 我知道我需要使用ko.toJSON(koModel)我得到了我需要的,但现在我对以下内容感兴趣: knockout如何隐藏所有属性,以便JSON.stringify()不会枚举它们? 更新 根据@dandavis的评论,我已经测试过了,是的-JSON.stringify()根本不显示函数,因为我的模型中填充了ko.observable()和ko.o
JSON.stringify(koModel)代码>我得到空对象{}
我知道我需要使用ko.toJSON(koModel)代码>我得到了我需要的,但现在我对以下内容感兴趣:
knockout如何隐藏所有属性,以便JSON.stringify()
不会枚举它们?
更新
根据@dandavis的评论,我已经测试过了,是的-JSON.stringify()
根本不显示函数,因为我的模型中填充了ko.observable()
和ko.observableARay()
我得到了一个空对象。我实际上没有使用敲除,但是一个相当好的猜测是,模型属性实际上是委托给包装对象的访问器函数(并且做更多的事情,比如更改时通知)。以下是一些表现出相同行为的代码:
var obj = { a: 1, b : 2 };
var ko = Object.create(null, {
_obj : { value : obj, enumerable: false },
a : {
get : function() { return this._obj.a },
set : function(v) { this._obj.a = v; console.log('Dispatch change event!') }
},
b : {
get : function() { return this._obj.b },
set : function(v) { this._obj.b = v; console.log('Dispatch change event!') }
}
});
ko.b = 3;
console.log(ko.a, ko.b);
console.log(JSON.stringify(ko));
是的,JSON.stringify
不考虑函数(根据)和不可枚举属性。在上面的例子中可以观察到这两种情况
根据haim770的评论,这更直截了当,因为属性本身就是函数,而JSON.stringify方法只是忽略了这些函数:
var ko = {
a : function(v) {
if (!arguments.length) return obj.a;
else { obj.a = v; console.log('Dispatch change event!') }
},
b : function(v) {
if (!arguments.length) return obj.b;
else { obj.b = v; console.log('Dispatch change event!') }
},
}
您可以使用.prototype、Object.defineProperty()或将函数用作子对象来实现这一点。@dandavis感谢defineProperty
!我真的不知道函数在JSON中没有显示。stringify()
Knockout不会试图“隐藏”任何东西,它只是可观察的函数使用的副作用。+1但Knockout不会像您介绍的那样使用getter和setter。实际使用是getter的someProp()
,setter的someProp(newValue)
。