原型 prototype
我們所創建的每一個函數,解析器都會向函數中添加 一個屬性prototype ,這個屬性對應的對象就是我們所謂的原型對象
判斷函數中是否含有prototype屬性,有則返回 true,否則返回 false
函數可以是構造函數,也可以是普通函數:
如果函數作為普通函數調用prototype沒有任何作用 // Person . prototype
當函數以構造函數的形式調用時,它所創建的對象中都會有一個隱含的屬性,指向該構造函數的原型對象
可以通過__proto__來訪問該屬性 // per . __proto__
原型對象就相當於一個公共的區域,所有同一個類的實例都可以訪問到這個原型對象,我們可以將對象中共有的內容,統一設置到原型對象中
當我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找,如果有則直接使用,沒有則會去原型對象中尋找,如果找到直接使用
例如:
MyClass . prototype . a = 123; // MyClass 原型對象中插入屬性a,並賦值123
MyClass . a = 123 ; // MyClass函數自身沒有a的屬性,則去原型MyClass函數中查找
var mc = new MyClass( ) ; //添加構造函數
mc . a = 456 ; // 通過MyClass創建新對象 mc中新增 a 屬性,並賦值 456
console . log( mc . a ) ; // 此時值是456,自身中找到,就不會去原型中查找
創建構造函數時,可以將這些對象共有的屬性和方法,統一添加到構造函數的原型中,這樣就不用分別為每一個對象添加屬性和方法,
也不會影響到全局作用域,就可以使每個對象都具有這些屬性和方法了
使用 in 檢查對象中是否含有某個屬性時,如果對象中沒有該屬性,但是原型中有,也會返回 true
console . log( ' name ' in mc ) ;
可以使用對象的hasOwnProperty( ) 來檢查對象自身是否含有該屬性,使用該方法只有當對象自身中含有屬性時,才會返回 true
console . log ( mc . hasOwnProperty( 'age' ) ) ;
原型對象也是對象,所以他也有原型,當我們使用一個對象的屬性或方法時,會先在自身中查找。
自身如果有,則直接使用
如果沒有則去原型對象中查找,如果原型對象中有,則使用
如果沒有擇取原型的原型中尋找,直到找到object 對象的原型
object對象的原型沒有原型(object的__proto__屬性是null),如果在object中依然沒有中找到屬性,則返回undefined
console . log( mc . __proto__ . __proto__ )