考虑下面代码:
BaseObject = function(name) { if (typeof name !== "undefined") { this.name = name; } else { this.name = 'default' } };
上面代码比较简单,就是提供了一个名字,就使用它,否则返回 default
:
var firstObj = new BaseObject(); var secondObj = new BaseObject('unique'); console.log(firstObj.name); // -> 'default' console.log(secondObj.name); // -> 'unique'
但是,如果这么做呢:
delete secondObj.name;
会得到:
console.log(secondObj.name); // 'undefined'
当使用 delete
删除该属性时,就会返回一个 undefined
,那么如果我们也想返回 default
要怎么做呢?利用原型继承,如下所示:
BaseObject = function (name) { if(typeof name !== "undefined") { this.name = name; } }; BaseObject.prototype.name = 'default';
BaseObject 从它的原型对象中继承了name 属性,值为 default。因此,如果构造函数在没有 name 的情况下被调用,name 将默认为 default。同样,如果 name 属性从BaseObject的一个实例中被移除,那么会找到原型链的 name,,其值仍然是default。所以'
var thirdObj = new BaseObject('unique'); console.log(thirdObj.name); // -> Results in 'unique' delete thirdObj.name; console.log(thirdObj.name); // -> Results in 'default'