浅谈prototype和_proto_

.Javascript中所有的对象都是Object的实例,并继承Object.prototype的属性和方法,也就是说,Object.prototype是所有对象的父亲。

在对象创建时,就会有一些预定义的属性,其中定义函数的时候,这个预定义属性就是prototype,这个prototype是一个普通的对象。

而定义普通的对象的时候,就会生成一个__proto__,这个__proto__指向的是这个对象的构造函数的prototype.例如:

function test(a){

    this.a=a;

}

函数在被定义的时候就拥有了一个prototype对象

打印出来的是同一个东西,也就是Object.prototype是所有函数的爸爸,当声明一个函数的时候也就是相当于Object的实例化。

Object.prototype.isPrototypeOf(test)===>true     test instanceof Object===>true

函数test的prototype对象的另一个属性是constructor这个属性就指向了函数test本身,也就是指向了他自己的构造函数

下面通过一个demo来说明一下原型。

function TestName(name){

    this.name=name;

}

var testB=new TestName(‘alibaba’)

 

根据以上结果可知testB中只有_proto_属性,这个属性指向他的构造函数的prototype

也就是说testB._proto_==TestName.prototype  ===>true

原型链

我们知道所有的对象都有一个toString()的方法,但是实例化对象b本身是没有toString()方法的,可是他为什么可以调用得到呢?

这是因为,他本身没有这个方法的时候就会沿着他的_proto_向他的构造函数TestName的prototype去找,如果TestName的prototype也没有,那他就会继续沿着TestName.prototype.__proto__向上找。而TestName.prototype.__proto__指向的就是Object.prototype。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值