Javascript原型介紹及原型工作原理與相關(guān)應(yīng)用
一、初識(shí)原型JS的引用類型會(huì)內(nèi)置一個(gè)特殊的屬性prototype。默認(rèn)的prototype是object類型的,是引用類型。例如,在定義函數(shù)SuperType時(shí),可以直接給其prototype屬性添加
一、初識(shí)原型
JS的引用類型會(huì)內(nèi)置一個(gè)特殊的屬性prototype。默認(rèn)的prototype是object類型的,是引用類型。例如,在定義函數(shù)SuperType時(shí),可以直接給其prototype屬性添加方法或?qū)傩?。示例:function SuperType(){}; function(){ alert("Hi"); };
二、原型鏈
在上面的示例中,通過prototype屬性將對(duì)象的原型連接起來(lái)形成了原型鏈。通過原型鏈,對(duì)象可以訪問到其原型鏈上的方法和屬性。例如,創(chuàng)建一個(gè)SubType對(duì)象實(shí)例s,可以通過s的原型鏈找到SuperType的原型上的方法sayHi。這樣實(shí)現(xiàn)了繼承的效果。
三、重置原型
要重置原型,只需要對(duì)原型重新賦值即可。例如,給Person的原型重新賦值為{ name: "Leo" }。注意,重寫后Person的原型的constructor變?yōu)镺bject。如果想保留constructor的功能,并且使其不可枚舉,可以使用進(jìn)行設(shè)置。
四、原型的動(dòng)態(tài)性
原型是動(dòng)態(tài)的,可以在運(yùn)行時(shí)修改原型的屬性和方法。例如,給Person的原型添加一個(gè)方法sayHi。在實(shí)例化對(duì)象之后,可以調(diào)用該方法。但是需要注意的是,如果在重寫原型時(shí)直接賦值為一個(gè)新的對(duì)象,那么實(shí)例化的對(duì)象將不再具有修改前的原型上的屬性和方法。
五、原型共享所引發(fā)的問題
原型的優(yōu)點(diǎn)就是共享,可以節(jié)約內(nèi)存空間。但是由于共享的特性,如果在一個(gè)對(duì)象上修改了原型上的屬性和方法,其他基于同一原型實(shí)例化的對(duì)象也會(huì)受到影響,可能導(dǎo)致意外的結(jié)果。
六、原型鏈與instanceof實(shí)現(xiàn)原理
通過使用instanceof運(yùn)算符可以判斷一個(gè)實(shí)例是不是屬于某個(gè)構(gòu)造函數(shù)創(chuàng)建的。實(shí)際上,instanceof的實(shí)現(xiàn)原理是從實(shí)例的原型開始,沿著原型鏈向上查找,看是否有與指定構(gòu)造函數(shù)的原型相等的原型。如果找到,則返回true,否則返回false。
總結(jié)
原型是JavaScript中非常重要的概念。通過原型,可以實(shí)現(xiàn)繼承和共享屬性和方法的功能。理解原型的工作原理和相關(guān)應(yīng)用對(duì)于掌握J(rèn)avaScript編程非常有幫助。