对js中的new关键字,__proto__,prototype的理解

浅谈我自己对对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在实例中的表现,有不清楚的地方欢迎留言探讨

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值