宝哥软件园

谈javascript原型链与继承

编辑:宝哥软件园 来源:互联网 时间:2021-09-09

Js原型链和继承是js中的关键点,所以我们将通过下面三个例子来详细说明。

首先,我们定义一个对象obj,它的原型是obj。_proto_。我们可以通过getPrototypeOf ES5查询obj的原型。我们通过判断是否等于Object.prototype来证明obj的原型是否存在,答案返回true,所以它存在。然后我们定义一个函数foo(),每个函数都有它的原型对象,也就是函数的原型。我们可以向函数的原型添加任意属性,然后实例化的对象可以通过new共享其属性(下面将详细介绍两个例子)。

function foo(){ } foo . prototype . z=3;var obj=new foo();obj . x=1;obj . y=2;obj . x//1 obj . y//2 obj . z//3 typeof obj . tostring;//functionobj . valueof();//foo {x: 1,y: 2,z : 3 } obj . hasown property(' z ');//假

这里,obj的prototype (_proto_)指向foo函数的prototype属性,foo.prototype的prototype指向Object.prototype,原型链的末端为空。通过hasOwnProperty检查Z属性是否在obj上,如果显示false,说明obj上没有Z属性,但是通过搜索它的原型链,发现它存在于foo.prototype上,所以obj.z=3,obj.valueOf()和toString都在Object.prototype上,所以任何对象都有这两个属性,因为任何对象的原型都是Object.prototype,除了下面的特殊情况,

var obj2=Object.create(空);obj 2 . Valueof();//undefinedObject.create()为创建一个空对象,该对象的原型指向参数。下面的综合示例显示了如何实现一个类来继承另一个类

//声明一个构造函数的人(姓名、年龄){this。name=namethis.age=年龄;} person . prototype . Hi=function(){ console . log(' Hi,我叫' this.name ',我的年龄是' this . age ');};person . prototype . legs _ NUM=2;person . prototype . arms _ NUM=2;person . prototype . walk=function(){ console . log(this . name '正在行走!);};函数Student(姓名、年龄、班级编号){ Person.call(this,姓名、年龄);this . class num=class num;}//创建一个空对象student . prototype=object . create(person . prototype);//构造函数指定创建对象的函数。学生.原型.构造者=学生;student . prototype . Hi=function(){ console . log(' Hi,我的名字是' this.name ',我的年龄是' this.age ',我的班级是' this . class num ');};student . prototype . learning=function(sub){ console . log(this . name ' is learning ' sub);};//实例化一个对象bosnvar bosn=new student ('bosn ',27,' class 3 ');bosn . hi();//嗨,我的名字叫博森,我的年龄是27岁,我的班级是3班博森。LEGS _ NUM//2 bosn . walk();//bosn在走!博森学习(“数学”);//bosn正在学习数学

这个构造函数Person和Student指向实例化的对象(Bosn),这个对象的原型指向构造函数的原型。

我们使用Object.create()方法创建一个空对象,其原型是Person.prototype,这样写的好处是可以自己创建Studnet.prototype的任何属性,而不影响Person.prototype的属性,并且可以继承Person.prototype的原始属性,因为子类Student继承了基类Person。如果你写的是人。原型=学生。原型直接,然后他同时指向一个对象。向学生添加属性时。原型,人的原型链也会添加相同的属性。

对于构造函数Student中的call方法,它指向新创建的Student的实例化对象,并通过调用继承。

学生。prototype.constructor=student,这句话的意思是指定student作为创建对象Student.prototype的函数,如果不写这句话,对象的函数仍然是Person。

实现继承有三种方式。

函数Person(姓名、年龄){ this.name=namethis.age=年龄;}函数Student(){ } Student . prototype=person . prototype;//1 student . prototype=object . create(person . prototype);//2 student . prototype=new Person();//3首先,如上所述,直接编写会让子类和基类同时指向bosn实例;

第二,就避开这一点,很好地实现继承,让实例先查询子类,如果没有对应的属性,再查询基类;

第三,虽然实现了继承,但是调用了名为Person的构造函数。在这个例子中,这个构造函数有两个参数,名字和年龄,但是第三个没有传递任何东西,也没有被实例化。

以上就是本文的全部内容,希望大家喜欢。

更多资讯
游戏推荐
更多+