再谈Javascript原型链

2023-06-02 0 598

JavaScript中的蓝本链是一类第一类间承继亲密关系的与此同时实现形式。每一第一类都有三个外部镜像对准其蓝本(prototype),蓝本也是三个第一类,它也有他们的蓝本,逐步形成了两条拉艾内部结构,这是蓝本链。

即使每一第一类都有三个蓝本,因而他们能在蓝本上表述特性和形式,那些特性和形式会被该第一类或其大部份后裔第一类所共享资源。当他们出访三个第一类的特性或形式时,假如该第一类这类没该特性或形式,则JavaScript会沿著蓝本链逐级搜寻,直至找出该特性或形式或是蓝本链的尾端为空。

JavaScript中的蓝本链是由下列三个主要就重要组成部分逐步形成的:

缺省和示例第一类

在JavaScript中,每一第一类都有三个缺省(constructor),它用作建立该第一类的蓝本。与此同时,每一缺省这类也有三个蓝本,因而它也能被视作第一类,并保有他们的蓝本链。比如:

function Person() {} console.log(Person.prototype);// Object { constructor: f Person() } console.log(typeof Person.prototype); // object console.log(typeof Person); // function console.log(Person.prototype.constructor === Person); // true constperson =new Person(); console.log(person.__proto__ === Person.prototype); // true

在那个范例中,他们表述了三个缺省Person,努瓦雷塔了它的蓝本第一类和类别。接着他们透过typeof运算符打印了Person的类别。由于Person这类也是三个函数,因而它的类别是function。接着他们验证了Person.prototype.constructor对准Person这类。最后,他们建立了三个person第一类,并验证了它的蓝本第一类对准Person.prototype

蓝本链

JavaScript中的蓝本链是透过蓝本第一类的镜像与此同时实现的。每一第一类都有三个外部特性__proto__,用作对准其蓝本第一类。当他们出访第一类的特性或形式时,假如该第一类这类没该特性或形式,则JavaScript会沿著蓝本链逐级搜寻。比如:

function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log(Hello!); };const person = new Person(Tom); console.log(person.__proto__); // Person { sayHello: [Function] } console.log(person.__proto__.__proto__); // Object {}

在那个范例中,他们表述了三个缺省Person,并在它的蓝本上添加了三个sayHello形式。接着他们建立了三个person第一类,努瓦雷塔了它的蓝本第一类和蓝本链上的父级蓝本第一类。由于person第一类这类没sayHello形式,因而JavaScript沿著蓝本链搜寻,在Person.prototype上找出了该形式并执行。

需要注意的是,虽然ES6之后引入了class关键字用作声明类和承继亲密关系,但JavaScript的承继本质上还是基于蓝本链的。在类声明中,他们透过extends关键字来指定父类,并使用super关键字调用父类缺省和形式,但实际上底层仍然是透过蓝本链与此同时实现的。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务