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