
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 |
3 enginex 2018-04-02 15:02:11 +08:00 subClass.superClass = superClass.prototype;// 位置二 console.log(SubClass.superClass.sayName); // (){console.log('name: ' + this.name);} subClass.superClass = superClass ;//位置二 console.log(SubClass.superClass.sayName); //undefined 父类构造函数上并没有 sayName 方法,这里调用是通过原型链实现的 |