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();