Javascript中原型与继承的关系是什么

  介绍

今天就跟大家聊聊有关Javascript中原型与继承的关系是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强>通常来说,Javascript中的对象就是一个指向原型的指针和一个自身的属性列表 .javascript创建对象时采用了写时复制的理念。

<强>只有构造器才具有原型属性强,原型链继承就是创建一个新的指针,指向构造器的原型属性。

原型属性之所以特别,是因为Javascript时读取属性时的遍历机制决定的。本质上它就是一个普通的指针。

<强>构造器包括:

<强>
2. 1.对象数组函数
3.
4.日期
5。字符串

下面我们来举一些例子吧

//每个函数都有一个默认的属性原型,而这个构造函数原型的默认指向这个函数//注意Person.constructor 不等于,Person.prototype.constructor只函数实例自带构造函数属性   functionPerson(名字){   this.name =,名称;   };   Person.prototype.getName =function () {   returnthis.name;   };   var  p =newPerson (“ZhangSan");   console.log (Person.prototype.constructor===人);//,真的   console.log (p.constructor===人);//,true ,这是因为p本身不包含构造函数属性,所以这里其实调用的是Person.prototype.constructor

我们的目的是要表示

<强> 1 <强>。 <强>表明人继承自动物

<强> 2。表明p2是人的实例

我们修改一下原型属性的指向,让人能获取动物中属的原型性中的方法,也就是人继承自动物(人是野兽),

functionPerson(名字){   this.name =,名称;   };   Person.prototype.getName =function () {   returnthis.name;   };   var  p1 =newPerson (“ZhangSan");   console.log (p.constructor===人);//,真的   console.log (Person.prototype.constructor===人);//,真的   functionAnimal () {}   Person.prototype =newAnimal();//之所以不采用Person.prototype =, Animal.prototype,是因为new 还有其他功能,最后总结。   var  p2 =newPerson (“ZhangSan");//(p2 →, Person.prototype →, Animal.prototype,,所以p2.constructor其实就是Animal.prototype.constructor)   console.log (p2.constructor===人);//,输出为false ,但我们的本意是要这里为真实的,表明p2是人的实例。此时目的1达到了,目的2没达到。

但如果我们这么修正

Person.prototype =, new 动物();   时间=Person.prototype.constructor 人;

这时p2.consturctor是对了,指向的是人,表示p2是人类的实例,但是新问题出现了。此时目的2达到了,目的1没达到。

目的1和目的2此时互相矛盾,是因为此时原型表达了矛盾的两个意思,

<强> 1 <强>。 <强>表示父类是谁

<强> 2 <强>。 <强>作为自己实例的原型来复制

因此我们不能直接使用原型属性来表示父类是谁,而是用getPrototypeOf()方法来知道父类是谁只

Person.prototype =newAnimal ();   Person.prototype.constructor=人;   var  p2 =newPerson (“ZhangSan");   p2.constructor//显示,function 人(),{}   Object.getPrototypeOf (Person.prototype) .constructor//显示,function 动物(),{}

就把这两个概念给分开了,其实通过使用hasOwnProperty()方法,什么时候访问的是实例属性,什么时候访问的是原型属性就一清二楚了

<强>新做了哪些事情?

当代码var p=新人()执行时,新做了如下几件事情:

创建一个空白对象

创建一个指向Person.prototype的指针

将这个对象通过这关键字传递到构造函数中并执行构造函数。

具体点来说,在下面这段代码中,

<代码> Person.prototype。getName=function(){}

如果我们通过

var  person =newPerson ();   其实类似于   var  person =newObject ();   person.getName =Person.prototype.getName;

因此通过person.getName()调用方法时,这指向的是这个新创建的对象,而不是原型对象。

这其实在给现有函数加上新功能的情况下会用的到,我们可以这么扩展现有的方法:

//function  myFunc 的写法基本上等于,var  myFunc =, new 函数();   function  myFunc  () {   }   myFunc =函数(函数){//可以在这里做点其他事情   returnfunction () {//可以在这里做点其他事情   return  func.apply(参数);   }   }(myFunc)

Javascript中原型与继承的关系是什么