標籤:name type attr 並且 function 沒有 att 繼承 var
//1、借用式繼承 把sup的建構函式裡的屬性方法複製一份sub執行個體對象 function Super(){ this.val = 1; this.fun1 = function(){console.log(‘fun1‘)}; } Super.prototype.name = "name"; Super.prototype.fun2 = function(){console.log(‘fun2‘)}; function Sub(){ Super.call(this); } var sub1 = new Sub(); var sub2 = new Sub(); console.log(sub1.fun1 === sub2.fun1); console.log(sub1.val); console.log(sub1.name); sub1.fun1();
//2、原型式繼承 把Super的執行個體對象拿作Sub建構函式的原型屬性 function Super(){ this.val1 = 1; this.fun1 = function(){console.log(1)}; } var pro = new Super(); function Sub(){} Sub.prototype = pro; var sub1 = Sub();
//3、寄生式 sub執行個體化對象新增了自己的屬性方法,並且把Super的執行個體對象拿作Sub建構函式的原型屬性 function Super(){ this.val1 = 1; this.fun1 = function(){console.log(1)}; } Super.prototype.val2 = 2; Super.prototype.fun2 = function(){console.log(2)}; function Sub(){ } Sub.prototype = new Super(); var sub1 = new Sub(); sub1.attr1 = 1; sub1.attr2 = 2;
//4、組合式繼承 把sup的建構函式裡的屬性方法複製一份sub執行個體對象,並且把Super的執行個體對象拿作Sub建構函式的原型屬性 function Super(){ this.val1 = 1; this.fun1 = function(){console.log(1)}; } Super.prototype.val2 = 2; Super.prototype.fun2 = function(){console.log(2)}; function Sub(){ Super.call(this); } Sub.prototype = new Super(); var sub1 = new Sub(); var sub2 = new Sub(); console.log(sub1); console.log(sub1.fun1 === sub2.fun1); console.log(sub1.fun2 === sub2.fun2);
//5、寄生組合式 Sub建構函式的原型屬性是第三個建構函式(它的原型為Sup的原型,但是沒有Sup建構函式裡的屬性方法)的執行個體對象,把sup的建構函式裡的屬性方法複製一份sub執行個體對象 function beget(obj){ // 生孩子函數 beget:龍beget龍,鳳beget鳳。 var F = function(){}; F.prototype = obj; return new F(); } function Super(){ // 只在此處聲明基本屬性和引用屬性 this.val = 1; this.arr = [1]; } // 在此處聲明函數 Super.prototype.fun1 = function(){}; Super.prototype.fun2 = function(){}; //Super.prototype.fun3... function Sub(){ Super.call(this); // 核心 // ... } var proto = beget(Super.prototype); // 核心 proto.constructor = Sub; // 核心 Sub.prototype = proto; // 核心 var sub = new Sub(); alert(sub.val); alert(sub.arr);
js中5中繼承方式分析