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);

以上是 我对这两个属性的理解 若是有错误的地方请指出来 我及时修改 以避免误导你们 

相关文章
相关标签/搜索