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;
}
}
谢谢。
1
WMutong 2018-04-02 09:44:34 +08:00
完整的继承:
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; } |
2
waiaan OP |