Javascript 敲除如何隐藏对象属性

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

我不熟悉knockout.js,但我的速度很快。有一件事我真的很沮丧,那就是如果我做了
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)