1. 最常见的组合式继承
function Parent(p){ this.p = p;} Parent.prototype.get = function() { //注:prototype其中就是一个空对象{},但它是function特有的对象 return this.p;}function Child(c){ Parent.call(this,c); //继承Parent的属性 this.c = 3;} Child.prototype = new Parent(); //现在,child.prototype对象就是Parent的实例,则里面含有 实例属性: p ,目前的值为 undefined,同时此时的 //Child.prototype.constructor = Parent ; var c = new Child(); //在c中又会有一份 实例属性p ; 这是因为: 在new Parent的时候,调用了一次 Parent的构造函数; 当调用Child的构造函数的时候,又调用了一次Parent的构造函数,又会在新对象上创建实例属性 p ; 为了避免这种重复创建属性的过程, 可以选择1 :及时修正 Child.prototype = new Parent(); Child.prototype.constructor = Child; //这可以避免 二次 创建,但是 一次创建的东西是 不会消失啦,也就是Child.prototype中保留着一份 实例属性 选择2 :改变继承方式:寄生组合式继承 function inheritPrototype( w, m) { var p = Object(w.prototype); p.constructor = m; m.prototype = p; } //属性继承不变 function Child(c) { Parent.call(this,c); this.c = c; } inheritPrototype( Parent ,Child ); 点评一下: 其实这个方法是先 偷梁换柱,再交还给 子类 选择3 :野生方法(好像不好看,不过很管用啊,可能效率有点低啦!) function Child( c) { Parent.call(this,c); this.c = c; } for( var i in Parent.prototype ) { Child.prototype[i] = Parent.prototype[i]; } 这样继承的话,Child.pototype.constructor 的值 还是Child 啦!而且Child.prototype中也不会有实例 属性 p; 其实,2、3差不多啦!
posted on 2016-03-01 22:41 阅读( ...) 评论( ...)