javascript
JS / 原型对象
原型prototype
我們所創(chuàng)建的每一個(gè)函數(shù),解析器都會(huì)向函數(shù)中添加一個(gè)屬性prototype、
? ? ? ? - 每個(gè)函數(shù)的原型對(duì)象prototype是不相等的
? ? ? ? - 如果函數(shù)作為普通函數(shù)調(diào)用prototype沒有任何作用
? ? ? ? - 當(dāng)函數(shù)作為構(gòu)造函數(shù)調(diào)用prototype:
通過構(gòu)造函數(shù)創(chuàng)建的對(duì)象有一個(gè)隱含屬性指向構(gòu)造函數(shù)的prototype原型對(duì)象。
prototype無法輕易訪問
訪問方法:
function MyClass(){}
var mc=new MyClass()
console.log(mc.__proto__==MyClass.prototype)
兩條下劃線proto兩條下劃線
? ? ? ? - 原型對(duì)象就相當(dāng)于一個(gè)公共的區(qū)域,所有同一個(gè)類的實(shí)例,都可以訪問到這個(gè)原型對(duì)象,可以將對(duì)象中共有的內(nèi)容,同一設(shè)置到原型對(duì)象中
MyClass.prototype.a=123;
?當(dāng)我們?cè)L問一個(gè)對(duì)象的屬性或方法時(shí),會(huì)在它的自身先去找,如果有則直接使用,如果沒有則會(huì)去原型對(duì)象中尋找,如果找到則直接使用。
可以通過mc.a來訪問到MyClass的原型函數(shù)中的a
如果mc.a=“456”
mc.a=456 ,該a為mc里的a 不會(huì)修改原型對(duì)象中的a
- 創(chuàng)建構(gòu)造函數(shù)時(shí),可以將這些對(duì)象共有的屬性和方法統(tǒng)一添加到構(gòu)造函數(shù)的原型對(duì)象中,這樣不用分別為每一個(gè)對(duì)象添加,也不會(huì)影響到全局作用域,就可以使每個(gè)對(duì)象都具有這些屬性和方法
- 當(dāng)用in檢查一個(gè)對(duì)象是否含有某個(gè)屬性值的時(shí)候,如果對(duì)象沒有但是原型中有,也會(huì)返回true
可以用對(duì)象的hasOwnProperty()來檢查對(duì)象自身中是否含有該屬性,該方法在原型對(duì)象的原型對(duì)象中
console.log(mc.hasOwnProperty("age"))
?Object原型里的__proto__屬性為空,因?yàn)镺bject的原型沒有原型,所以原型地址null
Object是構(gòu)造函數(shù),而Object.prototype是構(gòu)造函數(shù)的原型對(duì)象。
*****注意區(qū)分__proto__屬性和prototype屬性*****
__proto__指向prototype內(nèi)存放的地址 如果沒有prototype則__proto__值為null
原型對(duì)象也是對(duì)象,所以也有原型,當(dāng)我們使用一個(gè)對(duì)象的屬性或方法時(shí),會(huì)先在自身中尋找,自身中如果有,則直接使用,如果沒有則到原型對(duì)象中找,如果原型對(duì)象中有,則使用,如果沒有則去原型的原型中找,直到找到Object對(duì)象的原型,Object對(duì)象的原型沒有原型,如果在Object中依然沒有找到,則返回undefined
console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"))
輸出true
?(圖源:實(shí)例對(duì)象、構(gòu)造函數(shù)、原型之間的關(guān)系 - 李美玲 - 博客園 (cnblogs.com))
總結(jié)
- 上一篇: 一个json传参的错误:JSON par
- 下一篇: Predicting Malicious