prototype, _proto_以及constructor

在js中原型是一个非常关键的概念,在学习过程中难免会对其中的_proto_和Prototype等属性有些迷惑,这里结合资料将我对此的理解进行简单的描述。
首先,对于_proto_,它在ES标准定义中的名字应该叫[[prototype]],在谷歌浏览器中,将其命名为_proto_
首先要知道,在通过构造函数以及new来创建对象时,其实是将函数作为构造器,函数被调用,创建一个新的对象,然后返回该新对象的引用
这就是创建对象的过程,例如:
function Foo() {…};
let f1 = new Foo();

_proto_属性是对象所独有的,它的含义就是原型,一个对象的_proto_属性指向它们的原型对象,也可以理解为父对象,当我们访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会通过_proto_属性去它所指向的父对象里找,如果找不到,则会根据它父对象的_proto_属性去其爷爷属性里找,直到原型链的顶端null,这种通过_proto_属性来连接对象直到顶端的一条链即为原型链,所以说,_proto_其实就是一个指向,指向构造了自己的原型

Prototype属性是函数所独有的,是从一个函数指向一个对象,它的含义是指向函数的原型对象,也就是这个函数所创建的实例的原型对象,即f1.proto === Foo.prototype
这里首先要明白,所谓原型意为大略的构造,原始的模型。在js 中几乎所有的数据类型都可以作为对象,而每个对象的属性和方法都继承自另一个对象,后者就称为原型对象(除了null)而原型对象上的所有属性和方法都会被实例化对象所继承,
而我们知道prototype属性可以为对象添加属性和方法,而添加的方式是给创建了实例化对象的函数增加一个新的属性,然后再去设置该实例化对象的该属性的属性值。
对于prototype,我们可以理解为,它就是指向一个包含了可以让特定类型所创造的所有实例化对象共享的属性和方法的原型。
任何函数在创建的时候都会默认同时创建该函数的prototype对象,而当我们通过构造函数生成一个实例化对象时,代码会将实例化对象的原型指向构造函数的prototype属性
因此可以理解为,对于构造函数来说,prototype是作为构造函数的属性和方法,而对于实例化对象来说,prototype是实例化对象的原型对象。所以prototype即是一个属性,也是一个对象。
原型对象的属性不是实例化对象的属性。实例化对象的属性是继承自构造函数定义的属性,因为构造函数内部有一个this关键字来指向将要生成的对象实例。对象实例的属性,其实就是构造函数内部定义的属性。只要修改原型对象上的属性和方法,变动就会立刻体现在所有对象实例上
其实_proto_和prototype都是当访问一个对象的属性时,如果该对象内部不存在这个属性,就会去它的__proto__ / prototype属性所指向的那个对象里找,区别只在于_proto_是对象独有的,但函数也可以是对象,所以函数和对象都可以用,但是prototype是只有函数可以用的
Constructor
每个prototype对象都有一个constructor属性,它的英文释义是构造器,它是一个指向性的属性,默认指向prototype对象所在的构造函数,prototype是构造函数的属性,而constructor是构造函数的prototype属性所指向的那个对象,也就是原型对象的属性,所以constructor是只有对象才有的属性,在上面所举的例子中我们可以看出,所有的函数和对象都是由function构造函数得来的,所以在这里constructor属性的终点就是function。进而我们可以理解为,constructor属性的意义就是指向该对象的构造函数,而所有被看作对象的函数其最终的构造函数都会指向function。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值