当前位置: 首页 > Web前端 > HTML

JS原型链

时间:2023-04-02 11:40:50 HTML

1.JS原型的简单理解1.1原型原型:是函数的一个属性,每个函数都会有一个原型属性,原型属性是一个指向对象的指针。JavaScript中的原型是用于表示类型之间关系的原型对象。1.1.1原型定义每个函数都有一个原型属性,这个属性是对一个对象的引用,这个对象称为原型属性。functionPerson(){}varp=newPerson();1.1.2prototype原型对象包含实例共享的方法和属性。该函数在用作构造函数时被调用。当用new运算符调用时,新创建的对象会从原型对象中获得相同的属性和方法。原型的第一个作用:数据共享,节省内存空间原型的第二个作用:实现继承1.2_proto_proto:是一个对象拥有的内置属性,js内部使用它来查找对象的属性原型链。通过这个属性,可以使用实例对象直接访问原型。请注意,prototype是函数的内置属性,__proto__是对象的内置属性functionPerson(){}varp=newPerson();//以前不能直接使用p来直接访问对象原型//现在用__proto__//p.__proto__也可以直接访问对象原型//那么p.__proto__===Person.prototype1.2.1._proto_有什么用?您可以访问原型。因为在开发中,除非有特殊要求,否则不要使用实例来修改原型的成员。所以在开发的时候少用属性是很方便的,在调试的过程中也是很方便的。您可以轻松访问原型以查看成员。1.3.constructorconstructor:该属性返回对创建此对象的函数的引用。(指向原型对象的构造函数)2.原型链2.1什么是原型链?原型链是实例对象和原型对象之间的关系,他们使用__proto__来关联。图:分析:a._proto_==Funciton构造函数的原型对象,其实原型对象也是一个实例化对象,既然是对象,那么就是用Object创建的,即varobj=newObject();soFunctiondePrototypeobject._proto_==PrototypeobjectoftheObjectconstructor2.2原型对象是否可以改变,看下面的图形解释:functionPerson(name,age){this.name=name;这个。年龄=年龄;};Person.prototype={run:function(){console.log("每天坚持锻炼");}};varperson1=newPerson("汤姆",20);person1.run();//Output坚持每天锻炼很明显,构造函数的原型对象是可以改变的。更改后,实例化对象时,其原型对象为构造函数指向的新对象。三。继承3.1什么是继承?继承是类(Class)与类之间的一种关系。JS中没有类,但是可以通过构造函数来模拟类,通过原型实现继承。继承是为了数据共享。js中的继承也是为了数据共享。eg:建一个类“person”,里面有name、gender、age等属性和方法,然后建一个student类,可以继承person的name、gender、age等属性,而he也有自己的方法,比如:学习行为。看下面的代码://定义一个人的类别functionPerson(name,age,sex){this.name=name;这个。年龄=年龄;this.sex=性别;}Student.prototype=newPerson("Tom",20,"man");//定义一个学生类functionStudent(){this.s=function(){console.log("Student'svocationistolearn");}}//实例化一个学生对象varstudent=newStudent();student.s();//学生天职是学习console.log(student.name);//Tomconsole.log(student.age);//20console.log(student.sex);//man分析:实例化的student对象继承了Student对象的方法,继承了Person对象的姓名、年龄、性别属性。这就是继承。3.2实现继承的两种方式3.2.1改变原型对象的指针实现继承详细解释见下图//创建一个动物类functionAnimal(weight,color){this.weight=weight;this.color=颜色;};//创建一个狗类functionDog(){this.bite=function(){console.log("bite");};};Dog.prototype=newAnimal("25kg","white");//创建一个二哈(狗品种)类functionErha(){this.sayHello=function(){console.log("二哈是我们的好朋友,但是烦人的是它会拆房子!");}}Erha.prototype=newDog();//实例化一个对象vardog=newErha();dog.bite();//bitedog.sayHello();//二哈是我们的好朋友,但是烦人的是它会拆房子!console.log(dog.weight);//25kgconsole.log(dog.color);//小白分析:先创建一个Animal构造函数,有两个属性,然后创建一个Dog构造函数,并更改Dog的原型对象构造函数是Dog.prototype=newAnimal("25kg","white");最后,创建二哈对象,再次改变二哈的原型对象,Erha.prototype=newDog();实例化一个对象,然后.实例化后的对象具有Animal的属性和方法,包括Dog的属性和方法,实现了继承。缺陷:如果对象被实例化,其属性初始化值是相同的。3.2.2改变这点实现继承//创建Person类functionPerson(name,age,sex){this.name=name;这个。年龄=年龄;this.sex=性别;};//创建原型对象Person.prototype.run=function(){console.log("每天坚持锻炼");}//创建一个Studet构造函数Student(name,age,sex,score){//调用函数是在执行代码片段中改变this的指向。//this引用当前函数Person.call(this,name,age,sex);this.score=得分;this.study=function(){console.log("学生的天职是学习");}};//改变Student的原型对象。下面的代码非常重要。如果没有这段代码,就会出现无法继承父类原型对象的方法。这也是把this改成指向继承的缺陷,所以我们可以用两种模式共存的思路进行继承。Student.prototype=newPerson();varstu1=newStudent("Tom",19,"man",80);stu1.run();//每天坚持锻炼console.log(stu1.name);//Tomconsole.log(stu1.age);//19console.log(stu1.sex);//manconsole.log(stu1.score);//80解析:其实这个很简单,只要理解这个的方向就很容易理解。关于这一点,请看我的另一篇文章《Js面向对象第六篇总结》。我们先来分析一下。首先,我不会谈论创建类。这个指向的问题我就直接说吧。在这里,编辑器使用了一个call()方法。调用函数可以改变代码片段的this指向。在这个例子中,这个指向是当前函数。Person(this,name,age,sex)===this.name=name;this.age=年龄;this.sex=性别;现在明白了吗Add:apply函数,这个函数也可以改变点this来完成继承,看下面代码://创建一个Person类函数Person(name,age,sex){this.name=name;这个。年龄=年龄;this.sex=性别;};//创建原型对象Person.prototype.run=function(){console.log("Keepexerciseeveryday");}//创建Studet构造函数Student(name,age,sex,score){//调用函数就是在执行代码片段方向改变this。//this引用当前函数Person.apply(this,[name,age,sex]);this.score=得分;this.study=function(){console.log("学生的天职是学习");}};//改变Student的原型对象Student.prototype=newPerson();varstu1=newStudent("Tom",19,"man",80);stu1.run();//每天坚持锻炼console.log(stu1.name);//汤姆console.log(stu1.age);//19控制台日志(stu1.sex);//manconsole.log(stu1.score);//80这里只改变一行代码:Person.apply(this,[name,age,sex]);很明显,apply和call的区别就是参数问题。apply的第二个参数是一个数组,call是一个数据补充:bind函数bind的作用是复制函数并在函数中改变this,返回这个函数。看下面代码分析:functionPerson(name,age){this.name=name;这个。年龄=年龄;this.run=function(){console.log(this.age);}}varp1=newPerson("Tom",15);varp2=newPerson("杰克",19);p1.run.bind(p2)();//19分析:使用bind函数时,会复制一个函数,本例为复制fu??nction(){console.log(this.age)},并将其更改为p2。4.总结说实话,这一段真的很难看懂,我也只知道一点点,要想真正看懂,还需要慢慢沉淀。不知道你是学前端的,你觉得这部分怎么样,可以留言告诉我,我们一起努力吧!