參考博文
一、物件導向的繼承
1、解析:在原有物件的基礎上,略作修改,得到乙個新的物件,並且不影響原有物件的功能
2、如何新增繼承—拷貝繼承
屬性:call
方法: for in
/*
繼承:子類不影響父類,子類可以繼承父類的一些功能(**復用)
屬性的繼承:呼叫父類的構造1函式 call
方法的繼承:for in 拷貝繼承
*///父類
function
createperson
(name,***)
createperson.prototype.showname = function
()
var p1 = new createperson('小明','男')
p1.showname() //小明
//子類
function
createstar
(name,***,job)
//拷貝繼承
extend(createstar.prototype,createperson.prototype)
var p2 = new createstar("周杰倫",'男','歌手');
p2.showname(); //周杰倫
//物件導向的拷貝複製,防止影響父類物件的內容
function
extend
(obj1,obj2)
}
demo:
二、繼承的其他形式(用的不是很多)
1、類式繼承 : 利用建構函式(類)繼承的方式
/*js是沒有類的概念的,但我們可以把建構函式看做是類,這種方式是從後端轉變過來的 * */
//父類
function
aaa()
aaa.prototype.showname = function
()//子類
function
bbb(){}//這句話就是類式繼承
bbb.prototype = new aaa();
//修正指向問題
bbb.prototype.constructor = bbb;
var b1 = new bbb();
b1.showname(); //小明
但實際上上面的寫法還是有點問題的,假如name是乙個陣列的時候,父類的屬性會被修改,所以例子完善後如下
/*
1、js是沒有類的概念的,但我們可以把建構函式看做是類,這種方式是從後端轉變過來的
2、要做屬性和方法繼承的時候,要分開繼承
* */
//父類
function
aaa()
aaa.prototype.showname = function
()//子類
function
bbb()
//這個是建構函式,這個函式裡面沒有任何的屬性與方法,避免屬性繼承
var f = function
(){}
f.prototype = aaa.prototype;
//所以在b接收原型的時候,只能接收方法,不能接收屬性
bbb.prototype = new f();
bbb.prototype.constructor = bbb;
var b1 = new bbb();
b1.name.push(4);
var b2 = new bbb();
alert(b2.name); //1,2,3
2、原型繼承 : 借助原型來實現物件繼承物件
var a =
var b = cloneobj(a);
b.name = "小紅"
alert(a.name); //小明
alert(b.name); //小紅
function
cloneobj
(obj);
f.prototype = obj;
return
new f();strong>
}
總結:
拷貝繼承 : 通用型,有new或無new的時候都可以
類式繼承: new建構函式
原型繼承: 無new的物件
js 物件導向 繼承
繼承 將方法的定義放在建構函式中,每建立乙個新物件,都會重複建立該方法一模一樣的副本,浪費記憶體。解決 如果多個子物件都要使用乙個相同的方法時,應該把這個方法放在一種原型物件中,建構函式中不再包含方法定義。原型物件 乙個型別中,專門為所有子物件集中儲存共有方法的物件。同一型別下多個子物件需要用乙個共...
JS 物件導向 繼承
實現繼承是 ecmascript 唯一支援的繼承方式,而這主要是通過原型鏈實現的建構函式 原型和例項的關係 每個建構函式都有乙個原型物件,原型有乙個屬性 constructor 指回建構函式,而例項有乙個內部指標 prototype 指向原型。建構函式 function father console...
js物件導向 繼承
原型模式與建構函式組合 function person name,age,job person.prototype sayjob function 定義singer類,並指定job為singer function singer name,age,song 每次呼叫singer建構函式都會把singe...