4.JS原型
原型prototype:
????我們所創(chuàng)建的每一個函數, 解析器都會向函數中添加一個“屬性”:prototype
????這個屬性對應著一個對象,這個對象就是我們所謂的“原型對象”
????????function MyClass() {}
????????console.log(MyClass.prototype); ? Object類型
????
????如果函數作為普通函數調用prototype沒有任何作用,當函數以“構造函數的形式調用”時,它所創(chuàng)建的對象中都會有一個“隱含的屬性”,指向該構造函數的原型對象,可以通過“__ proto__”來訪問該屬性
????????var mc = new MyClass();
????????console.log(mc.__ proto__);
????
????同一個類實例化的對象原型指向同一個原型對象(類的原型),原型對象就相當于一個公共的區(qū)域,所有同一個類的實例都可以訪問到這個原型對象,我們可以將對象中共有的內容,統(tǒng)一設置到原型對象中
????????MyClass.prototype.a = 123;
????????console.log(mc.a); ? 123
????
????創(chuàng)建構造函數時,可以將這些對象共有的屬性和方法,統(tǒng)一添加到構造函數的原型對象中,這樣不用分別為每一個對象添加,也不會影響到全局作用域,就可以使每個對象都具有這些屬性和方法

????使用“in”檢查對象中是否含有某個屬性時,如果對象中沒有但是原型中有,也會返回“true”
????????console.log("name" in mc);
????可以使用對象的“hasOwnProperty()”來檢查對象自身中是否含有該屬性,使用該方法只有當對象自身中含有屬性時,才會返回“true”
????????console.log(mc.__ proto__.__ proto__.hasOwnProperty("age"));