proto屬性的作用主要是用來確定當前對象的繼承者,在當前對象找不到指定的屬性和對象時,會去proto屬性指定的對象中尋找,之后依次類推直到找完所有繼承或找到要找的屬性為止 js的函數(shù)會有一個默認的prototype對象,這個prototype對象用來指定函數(shù)的繼承關系,prototype對象默認有兩個屬性,一個是constructor,另一個就是proto屬性,默認的prototype對象在被改變之前就像是這個函數(shù)用來表示自己的一個對象,其中proto屬性和普通對象的proto屬性一樣用來對應繼承關系,而constructor屬性則代表了函數(shù)本身,舉個例子:
基本來說就是a繼承了對象b中的屬性或者方法。 最后說一下new的原理,用上面代碼中提到的new來舉例,new的過程是先生成一個空對象給c,然后把c的proto屬性指向a的prototype對象,最后執(zhí)行a.call(c)來構造對象c??偟膩碚f由于對象c的繼承指向了a的prototype對象也就是b,所以c能拿到b中的x屬性,證明a和b的繼承關系。 這里特別要說明一下,由于c的proto屬性指向了a的prototype,所以c的constructor也變?yōu)閍的prototype的constructor,這樣會產(chǎn)生一些問題,因為原本可以向這樣使用c()來實現(xiàn)a的方法,但現(xiàn)在由于a的prototype是b,所以a的constructor會變?yōu)閎的constructor,這樣調(diào)用就不會調(diào)用a方法而是調(diào)用b的constructor方法。所以必須執(zhí)行一下代碼來糾正這個問題。
c()就會依然調(diào)用原來的a方法,繼承也不會受影響。當然,如果你就是要用prototype的constructor方法那就不需要修改了~~ 差不多就是這些了,都是自己的一些理解,本人是做后端的,對前端可能理解的不好,希望前端高手指出問題,一起進步~~ |
|