想加深一下本身对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);
以上是 我对这两个属性的理解 若是有错误的地方请指出来 我及时修改 以避免误导你们