完整的继承:
var SuperClass=function(){
this.name='superClass';
};
SuperClass.prototype.sayName=function(){
console.log('name: ' +
this.name);
};
var SubClass=function(){
SuperClass.call(this,name);
};
function extend(subClass,superClass){
var F = function(){};
F.prototype = superClass.prototype;
subClass.prototype = new F(); //位置一
subClass.prototype.constructor = subClass;
// 下面这段代码,为什么要赋值为 superClass.prototype ?可不可以直接赋值为 superClass ?二者有什么区别?
subClass.superClass = superClass.prototype; //位置二
//
if(superClass.prototype.constructor == Object.prototype.constructor){
superClass.prototype.constructor = superClass;
}
}
extend(SubClass,SuperClass);
var sub1=new SubClass();
console.log(sub1); //位置五
sub1.sayName();
例子中,位置五( sub1 实例)输出:
SubClass{
name:"superClass",
__proto__:{
constructor:function(){
superClass:Object, //SuperClass 的构造函数
...
prototype:SuperClass //SuperClass 的构造函数
}
}
}
如果没有“ subClass.superClass = superClass.prototype;”,那么 位置五 输出:
SubClass{
name:"superClass",
__proto__:{
constructor:function(){
...
prototype:SuperClass //SuperClass 的构造函数
}
}
}
两者的区别在于:
一个是在 SubClass 构造函数中添加了,等于 SuperClass 原型的 superClass 属性。
一个没有添加。
但不论 位置二 是否存在,SubClass 都已经在 位置一 继承了 SuperClass 的原型方法。
所以,我认为 位置二 并不是必要的。
同时《 JavaScript 高级程序设计 第三版》中对于 “寄生组合式继承” 使用的示例为:
function inheritPrototype(subClass,superClass){
var prototype=object(superClass.prototype);
prototype.constructor=subClass;
subClass.prototype=prototype;
}