javascript 原型
構造函數存在的問題
構造函數中的方法,在每新創建一個對象的時候,該對象都會重新的創建一次這個方法,每個對象獨占一個方法。但是該方法的內容完全相同,所以造成資源浪費。
解決辦法1:
將構造函數內的方法進行提取,放在構造函數的外面,在構造函數內部進行引用賦值。
那麽創建出來的對象,都會指向構造函數外面的這個函數,達到共享的目的。
隨之帶來的問題:全局變量增多,造成全局變量汙染,代碼結構混亂,不容易維護。
解決方法2:
使用原型。
原型是什麽
在構造函數創建出來的時候,系統會默認的創建並關聯一個對象,這個對象就是原型,原型對象默認是空對象。
默認的原型對象中會有一個constructor屬性指向該構造函數。
原型的作用
原型對象中的成員,可以被使用和它關聯的構造函數創建出來的所有對象共享。
原型對象的使用
1. 使用對象的動態特性,為原型對象添加成員。
2. 直接替換原型對象。
註意事項:直接替換原型對象,會導致替換之前創建的對象的原型和替換之後創建的對象的原型不一樣。
替換原型註意事項:
在新替換的原型中,沒有constructor屬性,會影響三角(構造函數,原型,對象)結構關系的合理性,所以在新替換的原型中,手動添加constructor屬性,以保證關系的合理性,賦值為關聯的構造函數。
使用原型註意事項
1. 使用對象訪問屬性時,會先在對象中查找,如果找到了就直接使用,如果沒有找到就去原型中查找。
2. 使用對象設置屬性時,只會在對象本身中查找,不會去原型中查找,如果在對象本身中沒有找到這個屬性,就給該對象新增一個屬性,如果在對象中有這個屬性,修改這個屬性。
3. 如果在原型對象中有引用類型的屬性,那麽使用對象修改該屬性內容時,其它所有跟這個原型對象相關的對象都會受到影響。
4. 一般情況下不會將屬性添加到原型對象中,只會將需要共享的方法,添加到原型對象中。
__proto__
1. 這個屬性不是標準屬性,所以存在通用性問題。
2. 一般不推薦使用這個屬性。
3. 調試時可以使用這個屬性。
4. 這個屬性是原型中的屬性。
javascript 原型