上述代碼是傳統的通過function來定義類
ES5類繼承 注意:靜態方法無法繼承
聊一聊 apply和call方法 改變對象中this的指向
apply和call均可以用來實現繼承
什么情況下用apply,什么情況下用call?
在給對象參數的情況下,如果參數的形式是數組的時候,比如apply里面傳遞了參數arguments,這個參數是數組類型,並且在調用Animal的時候參數的列表是對應一致的(也就是Animal的參數列表是這樣的(name,age),而Cat的參數列表是(name,age,size)) 就可以采用 apply( Animal.apply(this,[name,age]) ) , 如果我的Animal的參數列表是這樣的(age,name),而Cat的參數列表是(name,age,size),這樣就可以用call來實現了,也就是直接指定參數列表對應值的位置( Animal.call(this,age,name) ); 補充:call和apply與bind比較,前2者會執行函數,后者返回函數而不執行,this指向用法都一致 bind用法:b=a.bind(obj) a是function obj是a中this指向的對象 b是返回后接收到的function
1.apply和call的應用解決參數傳遞問題,同時也不會影響父類中屬性的值,單純只是利用了父類的構造函數
2.原型鏈的繼承,用空函數來接收並傳遞父類原型中的方法,不會把父類不必要的屬性值一起傳遞出去,同時又是重新創建了一個新對象,而不是通過簡單賦值而與父類原型綁定在一起
(Cat.prototype = new Animal()與Cat.prototype =Animal.prototype 結合。前者會把age和voice一起傳給Cat原型中的_prop_。后者則不能獨立重寫Cat原型中的speak方法,因與Animal原型綁定在一起,如果修改了Cat原型的speak方法Animal原型中的speak也會修改,這樣就變成只能new Cat並在Cat實例中手動修改speak方法了)
上述代碼是ES6的類定義方法,在ES6中有了class這個語法糖便可以更好的定義類並理解
ES6類繼承 注意:同樣無法繼承靜態方法