JavaScript constructor prototyoe

想加深一下自己对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);

以上是 我对这两个属性的理解 如果有错误的地方请指出来 我及时修改 以免误导大家 

原文地址:https://www.cnblogs.com/dzxczx/p/5673801.html