了解過 javascript 的人基本都知道JS繼承的其它語言的繼承是有些不一樣的,其它的語言的繼承是基于類的繼承,而JS的繼承是基于原型的繼承。
基于類的繼承和基于原型的繼承有什么差別呢?
JavaScript 是基于原型的語言。當我們調(diào)用一個對象的屬性時,如果對象沒有該屬性,JavaScript解釋器就會從對象的原型對象上去找該屬性,如果原型上也沒有該屬性,那就去找原型的原型。這種屬性查找的方式被稱為原型鏈(prototype chain)。
而基于類的繼承,新建的子類從一個或多個父類那里獲得父類的特性,實例再從子類獲得特性。而實例一旦產(chǎn)生,將無法通過修改類的結(jié)果來影響它。
而JS的繼承,可以修改對象的原型,也可以修改原型的原型屬性,而且是動態(tài)改變實例對象的屬性。
而JS中原型繼承的實現(xiàn)有3種方法,它們是在不同規(guī)范、不同場景下的產(chǎn)物,但都可以實現(xiàn)原型繼承。具體選那種看應(yīng)用的場景。
在原型繼承中,prototype 是一個原型對象的一個對象屬性,而在這個對象屬相上又有自己的屬相。這些概念繞來繞去是比較容易混淆的。
而proto 是一個指向?qū)ο笤偷膒rototype的應(yīng)用,可以動態(tài)改變它的指向。
最后在說一下,JS的原型對象的幾個概念及其關(guān)系容易混淆,應(yīng)該深入了解它們的關(guān)系才能更好地記憶這個知識點。