当前位置: 首页 > 后端技术 > Node.js

JavaScript原型与原型链详解(二)

时间:2023-04-03 23:57:27 Node.js

第一节:JavaScript原型与原型链详解(二)在第一节中,我们介绍了javascript中的原型与原型链。在本节中,我们将使用原型以及我们可以使用原型链做什么。普通对象的继承vara={x:10,caculate:function(z){console.log(this.x+this.y+z)}};varb={y:20,__proto__:a};varc={y:30,__proto__:a};b.caculate(30)//60c.caculate(40)//80这样我们就通过原型链实现了普通对象的继承。接下来,我们将通过一张Prototype图来说明继承的过程。在上面的代码中,我们创建了三个普通对象a??、b、c,其中a有一个x属性和一个caculate方法;b和c都有一个y属性,让b和c的默认属性__proto__属性指向一个对象,如图。这是我们调用b.caculate(30),c.caculate(40)的时候。显然,b和c各自的方法中都没有caculate方法,所以这个时候,我们会沿着b的原型链往上查找,然后找到如果a中有caculate方法,那么就返回caculate方法。如果a中没有这个方法,那么就会沿着原型链继续向上查找。找到了就返回,找不到就返回undefined。“Animal”的构造函数和一个名为“Cat”的构造函数:functionAnimal(){};Animal.prototype.species="Animal";functionCat(name,color){this.name=name;this.color=color;}其中,Animal对象有一个原型属性species="animal",Cat对象有两个自身对象name和color。这时候,如果我们需要Cat对象拥有Animal对象中的属性怎么办呢?这很简单。我们只需要让Cat继承Animal对象即可。下面看看如何让Cat继承Animal:1Cat.prototype=newAnimal();2Cat.prototype.constructor=Cat;3varcat1=newCat("大白","White")4console.log(cat1.species)//animal上面的方法是通过直接继承prototype方法来继承的,如上图所示:当我们第一次创建Cat对象时,Cat.prototype默认指向Cat的原型(步骤1所示)。然后我们改变Cat的原型链,让Cat.prototype指向Animal的实例(该实例拥有构造函数的所有属性和方法),如第2步,这样就成功改变了Cat的原型链,当我们打电话给猫。species属性,可以沿着原型链找到Animal实例中的species属性,从而实现功能对象的继承。当然,这还没有结束,因为我们还有很重要的一步要完成,是的!就是上面的第二行代码。如果没有这行代码,Animal实例中的构造函数指针指向的是Animal的构造函数,这显然是错误的,因为正常情况下构造函数应该指向它的构造函数,所以我们需要手动改成:Cat.prototype.构造函数=猫;使构造函数再次指向Cat对象。我们这里所说的继承方式只是一种常见的方式,还有很多其他方式可以实现继承。这里有一篇阮一峰的文章:InheritanceofConstructors,讲了实现继承的常用方法。本文也参考了里面的方法。如果你看了这两篇文章,你还没有搞清楚原型和原型链。推荐几篇我读书时看的文章。一遍又一遍地看,总会弄明白的。毕竟我花了三天时间才弄明白的。最详尽的JS原型与原型链终极详解深入理解JavaScript系列(十):JavaScript核心(进阶高手必读)前端开发必知的JS(一)原型与继承