想加深一下本身對construtcor prototype的印象因此寫了這一篇文章函數
對象的constructor 就是Object 除了經過構造函數建立的對象意外 他的constructor 都是 都是Object的實例 this
而經過構造函數建立的對象 他的constructor是指向這個構造函數的 spa
1 function Person() { 2 this.name = 'dzxczx'; 3 this.sex = '男'; 4 } 5 var obj = new Person(); 6 console.log(obj.constructor);
prototype 是原形 是一個對象 是函數一建立就有的東西 對象沒有這個東西undefined prototype
1 var obj = { 2 name : 'dzxczx' 3 } 4 console.log(obj.prototype);
函數一建立就存在prototype屬性 3d
1 function func1() { 2 console.log(func1.prototype,typeof func1.prototype) 3 } 4 func1();
這個原形對象裏面什麼都沒有 可是是存在的 這個原形裏又有一個constructor屬性這個屬性指向當前函數 code
怎麼給他添加屬性方法呢 跟給對象添加是同樣的對象
1 function func1() { 2 } 3 func1.prototype.a = 10; 4 func1.prototype = { 5 b : 40 6 } 7 var obj = new func1(); 8 console.log(obj.a); 9 console.log(obj.b); 10
都是能夠的 注意func1.prototype.a要寫在字面量的後面 否則是undefined blog
1 function func1() { 2 } 3 func1.prototype = { 4 b : 40, 5 //constructor:'func1', 6 } 7 func1.prototype.a = 10; 8 var obj = new func1(); 9 console.log(obj.a); 10 console.log(obj.b);
使用了 字面量的方式來寫 會重寫 constructor 重寫以後不會指向 當前函數原型
1 function func1() { 2 } 3 func1.prototype = { 4 b : 40, 5 //constructor:'func1', 6 alF:function() {console.log(func1.prototype.constructor)} 7 } 8 func1.prototype.a = 10; 9 var obj = new func1(); 10 console.log(obj.a); 11 console.log(obj.b); 12 obj.alF();
咱們能夠本身再把他寫回來 上面代碼有io
prototype 裏面的屬性和方法是共享的
1 function func1() {} 2 func1.prototype.a = 10; 3 4 var obj1 = new func1(); 5 var obj2 = new func1(); 6 console.log('obj1:'+obj1.a); 7 console.log('obj2:'+obj2.a);
若是對象實例中和原型中存在的屬性或方法重名了 原形中的會被屏蔽 會使用實例中的
1 function func1() { 2 this.a = 999; 3 } 4 func1.prototype.a = 10; 5 6 var obj1 = new func1(); 7 console.log('obj1:'+obj1.a);
hasOwnProperty 方法是檢測一個屬性是存在實例中仍是存在原型中 若是存在實例中會返回true 不存在返回 false
1 function func1() { 2 this.b = 999; 3 } 4 func1.prototype.a = 10; 5 6 var obj1 = new func1(); 7 console.log(obj1.hasOwnProperty('b')); 8 console.log(obj1.hasOwnProperty('a'));
in操做符是隻要存在就返回true無論是實例仍是原形
1 function func1() { 2 this.b = 999; 3 } 4 func1.prototype.a = 10; 5 6 var obj1 = new func1(); 7 console.log('b' in obj1); 8 console.log('a' in obj1);
以上是 我對這兩個屬性的理解 若是有錯誤的地方請指出來 我及時修改 以避免誤導你們