JS的2种继承类型详解

JS的2种继承类型详解
js中的继承可以分为两种:对象模拟和原型链模式

首先,对象冒充包括三种:临时属性模式,称为()和()模式的应用
1。临时属性
复制代码代码如下所示:
功能人(名称){
this.name =名称;
this.say =函数(){
(我的名字是警惕+这个名字);
}
}
功能f2e(名称、编号){
this.temp =人;
This.temp(人名);
删除this.temp;
this.id = ID;
This.showId = function () {
警报(早上好,先生,我的工号是+这个ID);
}
}
Var Simon =新f2e(西蒙,9527);
Simon.say();
Simon.showId();

2.call()/()模式的应用
本质上,它改变了指针的方向。
复制代码代码如下所示:
功能人(名称){
this.name =名称;
this.say =函数(){
(我的名字是警惕+这个名字);
}
}
功能f2e(名称、编号){
person.call(这名字); / /申请()模式person.apply(这个新的数组(名字));
this.id = ID;
this.showid =函数(){
警报(早上好,先生,我的工号是+这个ID);
}
}
Var Simon =新f2e(西蒙,9527);
Simon.say();
Simon.showId();

缺点:首先,看看这样的内存分配图:

在OO概念中,当新实例化时,对象在堆内存中形成自己的空间值得注意的是代码部分。成员方法是代码段的存在,方法是共享的。问题就在这里。所有的成员方法都是针对这个对象时,模仿。也就是说,在新的,每一个实例将自己的这个成员方法不与大家分享它,这导致了大量的内存浪费。方式和对象是骗子不能继承的变量和方法的原型的定义,如下面的代码会出错:
复制代码代码如下所示:
功能人(名称){
this.name =名称;
this.say =函数(){
(我的名字是警惕+这个名字);
}
}
person.prototype.age = 20;
person.prototype.sayage =函数(){ alert(年龄+这个年龄)};

功能f2e(名称、编号){
person.apply(这个新的数组(名字));
this.id = ID;
this.showid =函数(){
警报(早上好,先生,我的工号是+这个ID);
}
}

Var Simon =新f2e(西蒙,9527);
Simon.sayAge(错误类型:西蒙。sayage); / /不是功能提示

二、原型链模式
复制代码代码如下所示:
功能人(){
this.name =西蒙';
}
person.prototype.say =函数(){
(我的名字是警惕+这个名字);
}

功能f2e(ID){
this.id = ID;
this.showid =函数(){
警报(早上好,先生,我的工号是+这个ID);
}
}
f2e.prototype =新的人();

Var Simon =新f2e(9527);
Simon.say();
Simon.showId();
警报(simon.hasownproperty('id')); / /检查是否自己的财产

按照以下示例了解以下JS原型链概念:

原型链可以理解为:每个JS对象有一个隐藏的__proto__属性,原型__proto__属性的对象类,原型法可以分配给另一个对象,该对象的__proto__需要它的类,从而形成一个链,也就是在前面的代码
复制代码代码如下所示:
f2e.prototype =新的人()
这句话是关键。当JS对象读取一个属性,它搜索的第一个自己的财产,并对对象的原型链的属性没有进一步搜索。也就是说,该原型链的方法可以共享,解决了对象的模仿记忆浪费的缺点。

缺点如下。
缺点是显而易见的。原型链继承,这样,当实例化子类,它不能传递参数到父类。这就是为什么功能人()在这个例子中没有参数,但它是直接写在这的原因。名称= simon.the下面的代码将不能达到预期的效果:
复制代码代码如下所示:
功能人(名称){
this.name =名称;
}
person.prototype.say =函数(){
(我的名字是警惕+这个名字);
}

功能f2e(名称、编号){
this.id = ID;
this.showid =函数(){
警报(早上好,先生,我的工号是+这个ID);
}
}
f2e.prototype =新的人();

Var Simon =新f2e(西蒙
Simon.say();
Simon.showId();
功能人(名称){
this.name =名称;
}

person.prototype.say =函数(){
(我的名字是警惕+这个名字);
}

功能f2e(名称、编号){
this.id = ID;
this.showid =函数(){
警报(早上好,先生,我的工号是+这个ID);
}
}

f2e.prototype =新的(人); / /这里不能按值传递的,this.name或名称不直接写f2e.prototype =新的人('wood)是可能的,但在这种情况下,(西蒙说)成了我的名字是木

Var Simon =新f2e(西蒙
Simon.say(不确定); / /我的名字是弹出
Simon.showId();
最后,我们总结了我们认为更好的继承方式。成员变量由对象建模,成员是原型。
复制代码代码如下所示:
功能人(名称){
this.name =名称;
}

person.prototype.say =函数(){
(我的名字是警惕+这个名字);
}

功能f2e(名称、编号){
person.call(这名字);
this.id = ID;
}

f2e.prototype =新的人();
/ /这里注意一个细节,showid不能写在f2e.prototype =新的人(前);
f2e.prototype.showid =函数(){
警报(早上好,先生,我的工号是+这个ID);
}

Var Simon =新f2e(西蒙
Simon.say();
Simon.showId();
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部