繼承是面向對象的一個核心概念,其餘主要面向對象的繼承主要靠兩種方式實現繼承 一種是繼承 另外一種是接口實現 javascript
一.原型繼承java
function Box(){ this.name=‘lll’; //被繼承的函數叫作超類型(父類型 基類) } function Desk(){ //繼承的函數叫作子類型(子類,派生類) this.age=100; } Desk.prototype=new Box(); var desk=new Desk(); alert(desk.name);
function Table(){
this.address='lol';
}
Table.prototype=new Desk();
var table=new Table();
alert(table.name);
Desk 的原型得到是Box()的實例和原型 以此類推函數
就近元則:先查詢實例有沒有該屬性 ,而後在查找原型裏面是否還有該屬性this
alert(desk instanceof Box) true
二.借用構造函數(對象冒充函數)prototype
解決引用共享和超類型傳參數的問題指針
functon Box(name,age){ this.name=name; this.age=age; //this.family=['哥哥','姐姐','弟弟'] } Box.prototype.family='家庭'; function Desk(){ Box.call(this,'lll',100); } var desk=new Desk(); alert(desk.name);
alert(desk.family) 對象冒充解決了共享問題和傳參數的問題 可是隻能繼承實例的問題 不能繼承原型 方法放在構造裏,浪費空間,每次實例化都分配地址
三.組合繼承(對象冒充繼承和原型繼承)對象
functon Box(name,age){ this.name=name; this.age=age; //this.family=['哥哥','姐姐','弟弟'] } Box.prototype.run(){ return this.name+this.age; } function Desk(){ Box.call(this,'lll',100); } Desk.prototype=new Box(); var desk=new Desk(); alert(desk.name); alert(desk.family) alert(desk.run())
四.原型繼承blog
function obj(0){ //中轉函數 function F(){} 用來存儲傳遞過來的對象 F.prototype=o; return new F(); } var box={ name:'lll'; age:100;
family:['哥哥' ,'姐姐'] } var box1=obj(box) box1 等於new F(); alert(box1.family);
box1.push('弟弟')
alert(box1.family);
var box2=obj(box);
alert(box2.family); 引用類型屬性共享了
五.寄生式繼承(原型加工廠模式)繼承
function obj(o){ //中轉函數 function F(){} 用來存儲傳遞過來的對象 F.prototype=o; return new F(); } function create(o){ //寄生式繼承
var f=obj(o);
f.run=function(){
return this.name
}
return f;
} var box={ name:'lll'; age:100; family:['哥哥' ,'姐姐'] }
var box1=create(box);
alert(box1.name)
六寄生組合繼承接口
function create(box, desk) { var f = obj(box.prototype); f.constructor = desk; //調整原型構造指針 desk.prototype = f; } function Box(name, age) { this.name = name; this.age = age; } Box.prototype.run = function () { return this.name + this.age + '運行中...' } function Desk(name, age) { Box.call(this, name, age); //對象冒充 } //經過寄生組合繼承來實現繼承 create(Box, Desk); //這句話用來替代Desk.prototype = new Box(); var desk = new Desk('Lee', 100); alert(desk.run()); alert(desk.constructor);