的繼承在很多書里面細致的分了很多種類型和實現(xiàn)方式,大體上就是兩種對象冒充、原型方式。這兩種方式各有優(yōu)點和缺陷,這里我給你先列舉出來,再從底層分析區(qū)別。當構造對象B的時候,調用temp相當于啟動A的構造函數(shù),注意這里的上下文環(huán)境中的this對象是B的實例,所以在執(zhí)行A構造函數(shù)腳本時,所有A的變量和方法都會賦值給this所指的對象,即B的實例,這樣子就達到B繼承了A的屬性方法的目的。
javascript繼承有哪兩種形式
< p > < p >的繼承在很多書中分為很多類型和實現(xiàn)方式,一般是對象模擬和原型兩種方式。
這兩種方法各有優(yōu)缺點。在這里,我先給大家列舉一下,再從底層分析區(qū)別。(1)該對象假裝是(name){ this . name = name
< p > this。= () {(this.name+"!")}
}B(name,Id){ this . temp = A
< p > this . temp(name) < p >//它相當于newa() < p > this . temp < p >//防止超類A的屬性和方法this.id將來被temp引用覆蓋。}}構造對象B時,調用temp相當于啟動A的構造函數(shù),注意這里上下文中的這個對象是B的一個實例,所以在執(zhí)行A的構造函數(shù)腳本時,A的所有變量和方法都會賦給這個所指向的對象,也就是B的實例,從而達到B繼承A的屬性方法的目的,刪除臨時引用temp后, 是為了防止維護B中A的類對象(注意不是實例對象)的引用改變,因為改變temp會直接導致A類的結構改變(注意不是A類的對象)。
我們可以看到,在Js版本更新的過程中,添加了call和apply函數(shù),以便更方便地切換這個上下文來實現(xiàn)繼承或更通用的目的。它們的原理是一樣的,只是參數(shù)的版本不同(一個變量是任意參數(shù),而一個參數(shù)集必須傳入數(shù)組)。這里以call為例說明call實現(xiàn)的對象假裝被繼承。Rect(width),{this.width=width
this。=
< p > this . area =(){ this . width * this。}
}(width,name){Rect.call(this,width,)
< p > this . name = name < p > this . show =(){ alert(this . name+" With area "+this . area()) < p > }關于調用方法,官方的解釋是調用一個對象的方法來使用另一個調用(,arg1,arg2…),這也是對象模擬的繼承。實際上,調用call方法時發(fā)生的也是上下文環(huán)境變量this的替換。在函數(shù)體中,這必須指向類對象的實例。但是,使用它作為上下文環(huán)境變量會調用Rect方法,即Rect類的構造函數(shù)。所以當Rect被調用時,它的賦值屬性和方法實際上是在一個新的對象上執(zhí)行的。因此,盡管call和apply不僅僅是繼承的新方法,它們也可以模擬繼承。對象模仿繼承就是這樣的東西,它可以實現(xiàn)多重繼承,只需要重復賦值的過程。然而目前并沒有大規(guī)模使用。為什么?< br >因為它有一個明顯的性能缺陷,所以有必要談談OO的概念。我們說對象是成員+成員方法的集合。構造對象實例時,這些實例只需要有自己的成員變量。成員方法只是一個對變量進行操作的可執(zhí)行文本區(qū)域。不需要為每個實例復制這個區(qū)域,所有實例都可以共享?,F(xiàn)在回到Js對模擬對象的繼承,所有的成員方法都是為此創(chuàng)建的,也就是說,所有的實例都有一個成員方法的副本,這是對內存資源的極大浪費。其他的缺陷,比如對象冒充變量,方法不能繼承域,就不用提了。我覺得前一個致命缺陷就夠了。但是我們還是要了解一下,尤其是父類的屬性和方法是如何繼承的原理,這對理解Js繼承非常重要。(二)原型。第二種類型的繼承是原型。所謂原型繼承,就是通過某種方式使用或覆蓋屬性方法來復制它。實現(xiàn)的方式有很多種,不同的框架可能會有一些差異,但是如果把握住了原理,就沒有什么不懂的了??匆粋€例子(某種實現(xiàn))(){this.name = "Mike" < p > this。= () {alert("!")}..=(){alert("你好!(){}。= new ()
< p >重點是將最后一句話中的prototype屬性賦給類構造的對象。在這里,作者解釋了如何將父類的屬性和方法復制到子類中。 < p >當Js對象讀取對象的屬性時,它總是首先查看自己域的屬性列表。如果有,就會返回;否則,它將讀取域(每個對象共享域的所有屬性和方法