今天就跟大家聊聊有关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中原型与继承的关系是什么