/** * 借助构造函数实现继承 */ function Parent1(){ this.name = "parent1"; } Parent1.prototype.say = function(){}; function Child1(){ //将父构造函数的this指向子构造函数的实例上 Parent1.call(this);//apply this.type = "child1"; } console.log(new Child1); /** * 借助原型链实现继承 */ function Parent2(){ this.name = 'parent2'; this.play = [1,2,3]; } function Child2(){ this.type = 'child2'; } Child2.prototype = new Parent2(); console.log(new Child2); var s1 = new Child2(); var s2 = new Child2(); console.log(s1.play,s2.play); s1.play.push(4); /** * 组合方式 * 缺点民:实例化两次父类 */ function Parent3(){ this.name = "parent3"; this.play = [1,2,3]; } function Child3(){ Parent3.call(this); this.type = 'child3'; } Child3.prototype = new Parent3(); var s3 = new Child3(); var s4 = new Child3(); s3.play.push(4); console.log(s3.play, s4.play); /** * 组合继承的优化1 */ function Parent4(){ this.name = "parent4"; this.play = [1,2,3]; } function Child4(){ Parent4.call(this); this.type = 'child4'; } Child4.prototype = Parent4.prototype; var s5 = new Child4(); var s6 = new Child4(); console.log(s5, s6); console.log(s5 instanceof Child4,s5 instanceof Parent4); //构造函数是一个,无法判断实例是父类创建还是子类创建 console.log(s5.constructor); /** * 组合继承优化2 */ function Parent5(){ this.name = "parent5"; this.play = [1,2,3]; } function Child5(){ Parent5.call(this); this.type = 'child5'; } //创建中间对象 Child5.prototype = Object.create(Parent5.prototype); Child5.prototype.constructor = Child5; var s7 = new Child5(); console.log(s7 instanceof Child5, s7 instanceof Parent5); console.log(s7.constructor);
//模拟new func就是一个构造函数 var new2 = function(func){ //第一步,创建一个空对象,空对象关联构造函数的原型对象 var o = Object.create(func.prototype); //第二步,执行构造函数,k表示返回结果 var k = func.call(o); //第三步,判断构造函数的动行结果是不是对象类型 if(typeof k === 'object'){ return k; }else{ return o; } }