如何为Object.define()定义的属性创建唯一的toJSON方法

时间:2014-09-14 17:10:51

标签: javascript json

假设我们有一个具有已定义属性的对象,该属性应指向另一个对象,如下所示:

Object.defineProperty(parent, 'child', {
    enumerable: true,
    get: function() { return this._actualChild; },
    set: function(v){
      if(v && typeof v === 'object'){
            this._actualChild = v;
      } else {
        throw new TypeError('child property must be an object!')
      }
    }
  });

有没有办法配置属性本身,以便当它运行JSON.stringify()时,.child属性的toJSON可以为该属性定义唯一?< / p>

例如,在我们设置了以下内容之后:

var jill = {id: 3, name: 'Jill'};
parent.child = jill;

如果我们能够以某种方式为parent.child定义toJSON以返回子项的id属性。所以JSON.stringify(parent)会返回:

{_actualChild: {id: 3, name: 'Jill'}, child: 3}

我们当然可以为子对象本身定义一个toJSON,但接下来我们会得到:

{_actualChild: 3, child: 3}

我想将属性toJSON方法与实际子对象的toJSON方法分开。这可能吗?

如果我可以做这样的事情,那将是非常好的:

  Object.defineProperty(o, 'child', {
    enumerable: true,
    get: function() {
      return this._hiddenChild;
    },
    set: function(v){
      if(v && typeof v === 'object'){
            this._hiddenChild = v;
      }
      else {
        throw new TypeError('child property must be an object!')
      }
    },
    toJSON : function() {
      return this._hiddenChild.id;
    }
  });

但是,唉,Object.defineProperty没有toJSON描述符。

1 个答案:

答案 0 :(得分:2)

不,您无法为单个属性定义字符串化行为。您需要在toJSON对象本身上放置parent方法:

var parent = {};
Object.defineProperty(parent, "child", {…});
parent.child = …;
parent.toJSON = function() {
    return {_actualChild:this.child, child:this.child.id};
};

> JSON.stringify(parent)
{"_actualChild":{"id":3,"name":"Jill"},"child":3}