knockout如何隐藏对象属性

时间:2014-02-24 07:40:43

标签: javascript knockout.js

我是knockout.js的新手,但是我的速度很快。我真的很沮丧的一件事是,如果我JSON.stringify(koModel);我得到空对象{}

我知道我需要使用ko.toJSON(koModel);,我得到了我需要的东西,但现在我感兴趣的是:

淘汰如何隐藏所有属性,以便JSON.stringify()不会枚举它们?

更新

根据@dandavis评论,我已经过测试,是的 - JSON.stringify()根本没有显示功能,因为我的模型充满了ko.observable()ko.observableArray()我得到了一个空对象

1 个答案:

答案 0 :(得分:2)

我实际上并没有使用淘汰赛,但是一个相当不错的猜测是模型属性实际上是委托给包装对象的访问器函数(并且做更多的事情,如更改时的通知)。以下是一些展示相同行为的代码:

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没有考虑函数(根据JSON spec)和不可枚举的属性。两者都可以在上面的例子中观察到。

根据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!') }
  },
}