傳統的類定義和ES6的類定義


image

上述代碼是傳統的通過function來定義類

ES5類繼承 注意:靜態方法無法繼承

image

聊一聊 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方法了)


image

上述代碼是ES6的類定義方法,在ES6中有了class這個語法糖便可以更好的定義類並理解

ES6類繼承 注意:同樣無法繼承靜態方法

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM