JavaScript constructor prototyoe

 

想加深一下本身對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);

以上是 我對這兩個屬性的理解 若是有錯誤的地方請指出來 我及時修改 以避免誤導你們 

相關文章
相關標籤/搜索