浅谈我自己对对js中的new关键字,__proto__,prototype的理解
首先谈一下new关键字做的事情:
function B(){
this.value='B'
console.log(this.value+'执行了B的初始化方法')
}
B.prototype.say='hello';
var b = new B();//打印 B执行了B的初始化方法
console.log(b.value);//打印 B
console.log(b.say);//打印 hello 首先在b的属性中寻找say,找不到的时候会去原型链即__proto__中去找
new关键字做了什么呢?一共分为三步:
1,var b = {};
2,b.__proto__ = B.prototype;
3,B.call(b);
第一行,我们创建了一个空对象b
第二行,我们将这个空对象的__proto__成员指向了B函数对象prototype成员对象,此时b中没有say属性,但b的原型链即B.prototype中有say属性,因此b.say可以正常打印,打印的值为hello
第三行,我们将B函数对象的this指针替换成b,然后再调用B函数,于是我们就给b对象赋值了一个value成员变量,这个成员变量的值是”B”。
__proto__是对象拥有的属性,prototype是函数拥有的属性,一个对象的__proto__指向它的构造函数的prototype,函数的prototype中的属性可以被它的实例通过__proto__访问到。其中属性的关系可以看下面的例子进行分析。
function s() {
this.a=[1,2,3];
}
s.prototype.b=[4,5,6]
var s1=new s();//调用s方法的初始方法(即给s1对象的this属性赋值a数组) 给s1的__proto__指向s的prototype
var s2=new s();//给s2对象的this也赋值a数组,s1和s2的a数组不是同一个数组 给s2的__proto__指向s的prototype ,因此s1,s2的b数组都是指向的s.prototype.b,是同一个b数组
s1.a[0]=2;
console.log(s1.a) //打印[2,2,3]
console.log(s2.a) //打印[1,2,3]
s1.b[0]=5;
console.log(s1.b) //打印[5,5,6]
console.log(s2.b) //打印[4,5,6]
文章比较简约,但我认为基本说明了new的作用,对象的__proto__的指向,函数的prototype在实例中的表现,有不清楚的地方欢迎留言探讨