1、我們所創建的每一個函數,解析器都會向函數中添加一個屬性prototype。這個屬性對應著一個對象,這個對象就是我們所謂的原型對象。如果函索作為普通函數調用prototype沒有任何作用。 當函數以構造函數的形式調用時,它所創建的對象中都會有一個隱含的屬性 指向該構造函數的原型對象,我們可以通過_ ...
1、我們所創建的每一個函數,解析器都會向函數中添加一個屬性prototype。這個屬性對應著一個對象,這個對象就是我們所謂的原型對象。如果函索作為普通函數調用prototype沒有任何作用。
當函數以構造函數的形式調用時,它所創建的對象中都會有一個隱含的屬性
指向該構造函數的原型對象,我們可以通過__proto__來訪問屬性
原型對象就相當於一個公共的區域,所有同一個類的實例都可以訪問到這個原型對象,我們可以將對象中共有的內容,統一設置到原型對象中。
當我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找,如果有則直接使用,如果沒有則會去原型對象中尋找,如果找到則直接使用
當我們創建構造函數時,可以將這些對象共有的屬性和方法,統一添加到構造函數的原型對象中
這樣不用分別為每一個對象添加,也不會影響到全局作用域,就可以使每個對象都具有這些屬性和方法了
1 <script type="text/javascript"> 2 function MyClass(){ 3 } 4 5 MyClass.prototype.a = 123; 6 MyClass.prototype.sayHello = function(){ 7 alert("Hello"); 8 }; 9 var mc = new MyClass(); 10 var mc2 = new MyClass(); 11 /*console.log(MyClass.prototype); 12 console.log(MyClass());*/ 13 console.log(mc2.__proto__ == MyClass.prototype); 14 mc.a = "我是mc中的a"; 15 console.log(mc2.a); 16 console.log(mc2.__proto__.a); 17 console.log(mc.a); 18 console.log(mc.__proto__.a); 19 </script>
2、使用in檢查對象中是否含有某個屬性時,如果對象中沒有但是原型中有,也會返回true
可以使用對象的hasOwnProperty()來檢查對象自身中是否含有該屬性
使用該方法只有當對象自身中含有屬性時,才會返回true
3、原型對象也是對象,所以它也有原型,
當我們使用一個對象的屬性或方法時,會先在自身中尋找,自身中有,則直接使用,
如果沒有則去原型對象中尋找,如果原型對象中有,則使用
如果沒有則去原型的原型中去尋找,直到找到Object對象的原型
Object對象的原型沒有原型,如果在Object原型中依然沒有找到,則返回underfined
1 <script type="text/javascript"> 2 function MyClass(){ 3 } 4 MyClass.prototype.name = "我是原型中的名字"; 5 var mc = new MyClass(); 6 mc.age = 123; 7 console.log(MyClass.prototype); 8 console.log(mc.name); 9 console.log("name" in mc); 10 console.log(mc.hasOwnProperty("name")); 11 console.log(mc.hasOwnProperty("age")); 12 console.log("hasOwnProperty" in mc); 13 console.log(mc.hasOwnProperty("hasOwnProperty")); 14 console.log(mc.__proto__.hasOwnProperty("hasOwnProperty")); 15 console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty")); 16 17 </script>