考虑下面代码:
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'