javascript
JS----javascript原型和原型链
原型對象
絕大部分的函數(少數內建函數除外)都有一個prototype屬性,這個屬性是原型對象用來創建新對象實例,而所有被創建的對象都會共享原型對象,因此這些對象遍可以訪問原型對象的屬性。
例如:hasOwnProperty()方法存在于Object原型對象中,他便可以被任何對象當做自己的方法使用
用法:object.hasOwnProperty(propertyName)
hasOwnProperty()函數的返回值為Boolean類型。如果對象object具有名稱為propertyName的屬性,則返回true,否則返回false
由以上代碼可知,hasOwnProperty() 并不存在于 person 對象中,但是 person 依然可以擁有此方法,所以 person 對象是如何找到 Object 對象中的方法呢? 靠的是原型鏈
1. prototype
每個函數都有一個prototype屬性,被稱為顯示原型
2._ _proto_ _
- 每個實例對象都會有_ proto _屬性,其被稱為隱式原型
- 每一個實例對象的隱式原型_ proto _屬性指向自身構造函數的顯式原型prototype
3. constructor
每個prototype原型都有一個constructor屬性,指向它關聯的構造函數。
4. 原型鏈
原因是每個對象都有__proto__屬性,此屬性指向該對象的構造函數的原型
對象可以通過__proto__ 與上游的構造函數的原型對象連接起來,而上游的原型對象也有一個 __proto__,這樣就形成了一個原型鏈
獲取對象屬性時,如果對象本身沒有這個屬性,那就會去他的原型__proto__上去找,如果還查不到,就去找原型的原型,一直找到最頂層(Object.prototype)為止。Object.prototype對象也有__proto__屬性值為null。
這里需要注意的是Object是屬于原型鏈的頂層,所有構造函數的的prototype都指向 Object.prototype
首先,fn的構造函數是Foo()。所以:
又因為Foo.prototype是一個普通的對象,它的構造函數是Object,所以:
Foo.prototype._ _ proto _ _=== Object.prototype通過上面的代碼,我們知道這個toString()方法是在Object.prototype里面的,當調用這個對象的本身并不存在的方法時,它會一層一層地往上去找,一直到null為止。
所以當fn調用toString()時,JS發現fn中沒有這個方法,于是它就去Foo.prototype中去找,發現還是沒有這個方法,然后就去Object.prototype中去找,找到了,就調用Object.prototype中的toString()方法。
這就是原型鏈,fn能夠調用Object.prototype中的方法正是因為存在原型鏈的機制。
另外,在使用原型的時候,一般推薦將需要擴展的方法寫在構造函數的prototype屬性中,避免寫在_ _ proto _ _屬性里面。
總結
以上是生活随笔為你收集整理的JS----javascript原型和原型链的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS----JavaScript中的作用
- 下一篇: 关于婚姻的人生感言259个