将对象的* any *属性设置为默认值

时间:2017-05-10 09:17:41

标签: javascript

我想知道是否可以覆盖对象的未启动键的“未定义”,以便:

var obj={}
console.log(obj.randomKey)

output in console:
0

我很清楚我“忘记”启动obj.randomKey。 这实际上是我的问题。

我可以为对象或类的任何未启动的键设置默认值吗?

如果你很好奇

我问的原因是我正试图解决一个允许用“原生”语言创建对象的谜语,例如:

const jane = new Thing('Jane')
jane.name // => 'Jane'    

// can define boolean methods on an instance
jane.is_a.person
jane.is_a.woman
jane.is_not_a.man

jane.is_a_person // => true
jane.is_a_man // => false

这是我采取的第一个策略:)

更新 我解开了谜语:) 如果有人有兴趣尝试:https://www.codewars.com/kata/the-builder-of-things/train/javascript

2 个答案:

答案 0 :(得分:5)

你不能真正定义默认值,但你可以使用ES2015 proxies假装他们有一个:

function createObj(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      if (target[key] === undefined) {
        return 0;
      }

      return Reflect.get(target, key, receiver);
    }
  });
}

const myObj = createObj({});
console.log(myObj.test); // 0

很好的语言btw方法!

答案 1 :(得分:1)

没有办法在Javascript中设置它 - 对于不存在的属性返回undefined是核心Javascript规范的一部分。请参阅有关此类似问题的讨论。正如我在那里建议的那样,一种方法(虽然我不能真正推荐它)是定义一个全局的getProperty函数:

function getProperty(o, prop) {
    if (o[prop] !== undefined) return o[prop];
    else return "my default";
}

var o = {
    foo: 1
};

getProperty(o, 'foo'); // 1
getProperty(o, 'bar'); // "my default"

但这会导致一堆非标准代码难以被其他人阅读,并且可能会在您期望或想要未定义值的区域产生意想不到的后果。最好随便检查一下:

var someVar = o.someVar || "my default";