想加深一下自己对construtcor prototype的印象所以写了这一篇文章
对象的constructor 就是Object 除了通过构造函数创建的对象意外 他的constructor 都是 都是Object的实例
而通过构造函数创建的对象 他的constructor是指向这个构造函数的
1 function Person() { 2 this.name = 'dzxczx'; 3 this.sex = '男'; 4 } 5 var obj = new Person(); 6 console.log(obj.constructor);
prototype 是原形 是一个对象 是函数一创建就有的东西 对象没有这个东西undefined
1 var obj = { 2 name : 'dzxczx' 3 } 4 console.log(obj.prototype);
函数一创建就存在prototype属性
1 function func1() { 2 console.log(func1.prototype,typeof func1.prototype) 3 } 4 func1();
这个原形对象里面什么都没有 但是是存在的 这个原形里又有一个constructor属性这个属性指向当前函数
怎么给他添加属性方法呢 跟给对象添加是一样的
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
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();
我们可以自己再把他写回来 上面代码有
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);
以上是 我对这两个属性的理解 如果有错误的地方请指出来 我及时修改 以免误导大家