0

如果没有选项对象传递给我的构造函数,我想设置一个默认的“小”:

var Plan = function(options){
  this.name = options.name || 'small';
}

但是当我这样做时:

var smallPlan = new Plan();

console.log(smallPlan.name);

我明白了Uncaught TypeError: Cannot read property 'name' of undefined

我究竟做错了什么?这不是在 javascript 中设置默认参数值的惯用方式吗?

4

2 回答 2

9

不要过度复杂地检查代码是否存在选项和名称,而是检查对象是否已定义,如果没有,请将其设置为空对象。

var Plan = function(options){
  options = options || {};
  this.name = options.name || 'small';
}
于 2013-01-09T14:09:04.223 回答
4

options未定义。options.name如果options不存在,则无法访问。

如果您想检查的不仅仅是一个属性,我建议您这样做:

var Plan = function(options){
    // Set defaults
    this.name = 'foo';
    this.title = 'bar';
    this.something = 'even more stuff';
    if(options){ // If options exists, override defaults
       this.name = options.name || this.name;
       this.title = options.title || this.title;
       this.something = options.something || this.something;
    }
}

否则,我会试试这个:

var Plan = function(options){
    this.name = options ? options.name || 'small' : `small`;
}

这有点难看,但你必须检查是否options存在,如果options有一个name属性。

这是做什么的:

if(options){
    if(options.name){
        this.name = options.name;
    } else {
        this.name = 'small';
    }
} else {
    this.name = 'small';
}
于 2013-01-09T14:07:39.927 回答