标签:rabl 函数调用 style 无法 code UNC ret name str
function Super(name){ this.name=name; this.age=25; this.array=[1,2,3]; this.obj={a:‘prop‘}; this.say=function(){ console.log(this.name); } } Super.prototype.testInherit=function(){ console.log(‘I am method of super prototype‘) }
child1.testInherit();
function Child1(name){ Super.apply(this,arguments); this.name=name; this.sayName=function(){ console.log(this.name); } } var parent=new Super(‘lucy‘); var child1=new Child1(‘jack‘); var child1=new Child1(‘jack2‘); console.log(parent,child1); console.log(child1.__proto__===Child1.prototype,child1 instanceof Super);//true flase child1.array.push(4); console.log(child1.array,child2.array,s1.array,); child1.testInherit();
function Child2(name){ this.name=name; this.sayName=function(){ console.log(this.name); } } var parent=new Super(‘lucy‘); Child2.prototype=parent; var child1=new Child2(‘jack‘); var child2=new Child2(‘jack2‘); child1.array.push(4); child1.obj.b="prop2"; console.log(child1.array,child2.array,child1.obj,child2.obj); console.log(child1.constructor);
function Child3(name){ Super.apply(this,arguments); this.name=name; } var parent=new Super(‘lucy‘); Child3.prototype=parent; var child1=new Child3(‘jack‘); var child2=new Child3(‘jack2‘); child1.array.push(5); console.log(child1.array,child2.array); console.log(child1.constructor);
function Child4(name){ Super.apply(this,arguments); this.test=44; } Child4.prototype=Super.prototype;//改进父类构造函数调用两次问题 Child4.prototype.constructor=Child4; var child1=new Child4(‘bob‘); var child2=new Child4(‘bob2‘); console.log(child1.__proto__===Child4.prototype); console.log(child1.__proto__.constructor,‘\n‘,Child4.prototype.constructor,‘\n‘,Super.prototype.constructor); console.log(Super.prototype.constructor); //这种方法改变了父类的构造函数 for(var itm in Child4.prototype){ console.log(itm); }
// 或者使用Object.create()创建一个过渡对象--这样子类重新定义构造函数,就能使父类和子类各有自己的构造函数 function Child5(name){ Super.apply(this,arguments); this.test=55; } Child5.prototype=Object.create(Super.prototype); Child5.prototype.constructor=Child5; Object.defineProperty(Child5.prototype,‘constructor‘,{//Child5的原型是一个实例对象,所以显示的定义constructor会改变其不可枚举的特性,这里修正一下 enumerable:false }); var child=new Child5(‘end‘); console.log(Child5.prototype.constructor,Super.prototype.constructor); console.log(child instanceof Child5,child instanceof Super); console.log(child.constructor,Child5.prototype.isPrototypeOf(child),Super.prototype.isPrototypeOf(child)); for(var itm in Child5.prototype){ console.log(itm); }
function inheritProperty(sup,child){ function F(){}; F.prototype=sup.prototype; var inner=new F(); inner.constructor=child; child.prototype=inner; Object.defineProperty(child.prototype,‘constructor‘,{ enumerable:false }); } function Child6(name){ this.age=66; this.name=name; } inheritProperty(Super,Child6); Child6.prototype.sayAge=function(){ return this.age; } var child=new Child6(‘end‘); console.log(child.constructor); console.log(Child6.prototype.constructor); console.log(child.sayAge());
以上继承都是以1,2为基础的,具体说实现继承的方式就这两种,其他只是对这两种的组合改造优化
标签:rabl 函数调用 style 无法 code UNC ret name str
原文地址:https://www.cnblogs.com/yifeng555/p/9045292.html