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

【js】原型与原型链

时间:2023-03-27 14:16:54 JavaScript

原型和原型链相关属性prototype__proto__constructor1.prototypeowner:所有的函数都有这个属性指向:构造函数创建的实例对象的原型对象,可以理解为一个节点,构造函数实例化的对象可以继承其上的属性和方法原型对象functionStudent(name){this.name=name}letstd1=newStudent("张三")Student.prototype.getName=function(){console.log(this.name);}std1.getName()//张三2.__proto__Owner:所有对象都有属性指针:对象的原型对象可以理解为一个指针,指向对象函数Student()的原型对象{}letstd1=newStudent()Student....constructor==Student//trueStudent.prototype.constructor==Student//true4.从1和2可以知道原型链,实例化对象的__proto__指向构造函数的原型,原型对象还有__proto__属性,指向一个Prototype对象,那么__proto__连接的原型对象可以是看成是一条原型链,所以可以得到如下关系图。原型对象由Object构造函数生成。红线是原型链//School构造函数School(name,age){this.name=namethis.age=age}School.prototype.getName=function(){console.log(this.name);}School.prototype.getAge=function(){控制台.log(this.age);}//实例化一个学校letsch1=newSchool("ScienceandTechnology",100)//学生构造函数Student(name,age){this.name=namethis.age=age}//实例化一个学生letstd1=newStudent("张三",18)//改变一个学生的原型指向std1.__proto__=sch1std1.getName()//张三console.log(std1.hasOwnProperty("getName"));//falseconsole.log("getName"instd1);//truestd1上没有getName方法,hasOwnProperty返回false使用in运算符,可以看到getName在原型链上,是一个方法继承自std1std1.__proto__->sch1.__proto__->School.prototype5.Function和ObjectFunction的特殊性构造了自己的函数Student(){}创建函数时,相当于下面的代码letStudent=newFunction()那么这个函数可以看做是一个实例化的对象,它也有__proto__属性。Function是一个构造函数Student(){}Student.__proto__===Function.prototype//trueFunction是一个函数也应该有一个构造函数,而这个构造函数本身就是Function.__proto__===Function.prototypeObject是由Functionletobj={}letobj=newObject()字面量创建对象相当于用new实例化一个ObjectObject是构造函数,函数应该是new实例化的Function,Object是Function的实例化对象,然后就有了一个__proto__属性Object.__proto__===Function.prototype//trueObject.__proto__===Function.__proto__//true由于Function是作为构造函数自己构造的,所以Function的__proto__和原型是一样的。其中__proto__指向Function的原型,最终可以得到Object.__proto__===Function.__proto__。那么其他内置对象是否具有相同的特性呢?总结理解prototype和prototype链,主要就是区分谁有什么属性,即prototype、__proto__、constructor、function属于谁?目的?原型?它们分别代表什么?第5点只是辅助理解,也是在强调它是什么,有什么属性