资讯专栏INFORMATION COLUMN

面向对象的程序设计之继承

魏明 / 750人阅读

摘要:以下是几种中实现继承的方式方法它们也是各自有各自的优缺点选择哪一种根据自己的应用而定最适合自己的才是最好的通过原型链继承通过原型对象继承缺点引用类型的值在原型中会被所有实例共享不能向超类的构造函数中传递参数借用构造函数继承借用构造函数继承是

以下是几种js中实现继承的方式方法,它们也是各自有各自的优缺点,选择哪一种根据自己的应用而定,最适合自己的才是最好的.

通过原型链继承
function SuperType(){
    this.name = "yahualingfeng";
}

SuperType.prototype.friends = ["David","Bob","Lucy"];
SuperType.prototype.sayName = function(){
    
  alert(this.name);
  
};

function SubType(){
    this.age = 30;    
}

SubType.protoType = new SuperType();//通过原型对象继承SuperType

var subType1 = new SubType();
var subType2 = new SubType();

subType1.friends.push("Jake");

console.log(subType1.friends); // ["David","Bob","Lucy","Jake"]
console.log(subType2.friends); // ["David","Bob","Lucy","Jake"]

缺点:

引用类型的值在原型中会被所有实例共享.

不能向超类的构造函数中传递参数

借用构造函数继承

借用构造函数继承是将超类(SuperType)所有的属性和方法都写在构造函数中,最后在函数(SubType)体内通过call方法调用超类.

function SuperType(){
    this.name = "yuhualingfeng";
    this.friends =["David","Bob","Lucy"];
    this.sayName = function(){
        alert(this.name);
    }
}

function SubType(){
    SuperType.call(this);
}

var subType = new SubType();
subType.sayName();

缺点:方法的定义都存在构造函数中,导致函数无法被复用.

组合继承

组合继承是原型链继承和构造函数继承的结合体,结合了二者的优点,即实现了函数的复用,也不会导致引用类型值在多个实例中共享.

function SuperType(){
    this.name="yuhualingfeng";
    this.friends=["David","Bob","Lucy"];
}
SuperType.prototype.sayName = function(){
    
    alert(this.name);

};

function SubType(){

    SuperType.call(this);

}

SubType.prototype = new SuperType();

var subType = new SubType();

缺点:

超类函数被执行了两次.

超类构造函数SuperType自身的属性(name,friends)被重复定义,即出现在SubType的构造函数中,也出现在SubType的原型对象中.

原型继承

原型继承是继承自一个对象而不是引用类型.

function object(obj){
 function F(){}
 F.prototype = obj;
 return new F();
}

这里的object方法接收obj对象,并将对象赋值给一个空函数的原型,并返回空函数的实例.

var person = {
 name:"yuhualingfeng",
 friends:["David","Bob","Lucy"]
};

var anotherPerson = object(person);
anotherPerson.name = "Jake";
anotherPerson.friends.push("Marry");

console.log(anotherPerson.friends); //["David","Bob","Lucy","Marry"]

console.log(person.friends); //["David","Bob","Lucy","Marry"]

如果不想创建构造函数,只想让一个对象和另一个对象保持一致的情况下,原型继承是完全可以胜任的,不过有一点要注意的是,假如继承的属性值为引用类型时,还是会相互影响的.

寄生继承

寄生继承是基于原型继承的基础上扩展自己的属性和方法.

function createrAnother(obj){
    var clone = object(obj);
    clone.sayHi=function(){
     alert("Hi!");
    }
    return clone;
}

var person = {
    name:"yuhualingfeng"
};

var anotherPerson = createAnother(person);

anohterPerson.sayHi();  // Hi

寄生继承也是和原型继承一样也是继承对象,并产出对象.

寄生组合继承

顾名思义,寄生组合继承是集寄生继承和组合继承的结合体,它结合了二者的优点.

//继承Supertype的原型对象
function inheritProtoType(SuperType,SubType){
 
     var prototype = object(SuperType.prototype);
     prototype.constructor = SubType;
     SubType.prototype = prototype;

}

function SuperType(){
    this.name = "yuhualingfeng";
    this.friends = ["David","Bob","Lucy"];
}

function SubType(){
    ////继承Supertype的构造函数属性
    SuperType.call(this);
    this.age = 30;
}

inheritProtoType(SuperType,SubType);

var subType = new SubType();

寄生组合继承是前面几种继承思想碰撞在一起的产物,是执行效率最高也是应用面最广的.

总结

原型链继承是通过为原型对象赋值,不足之处为引用类型值会被多个实例共享,构造函数继承解决了原型链继承的问题,同时也暴露出新的问题是函数的复用无法实现,然后我们结合二者的优缺点,构造出了组合继承,组合继承基本上满足了我们想要的继承结果.
考虑到执行的效率,我们构思出了寄生继承(基于原型继承),并将寄生继承组合继承结合,最终得出了继承的最优解决方案"寄生组合继承.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92340.html

相关文章

  • JS面向对象程序设计继承实现-组合继承

    摘要:实现思路使用原型链实现对原型方法和方法的继承,而通过借用构造函数来实现对实例属性的继承。继承属性继承方法以上代码,构造函数定义了两个属性和。 JS面向对象的程序设计之继承的实现-组合继承 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。如有纰漏或错误,会非常感谢您的指出。文中绝大部分内容引用自《Java...

    antz 评论0 收藏0
  • 面向对象JavaScript继承(一) 类式继承

    摘要:那你们肯定会问为什么共用,而没有共用呢,下面就给你解释,请看引用类型是共用的值类型是私用的。 引言 面向对象的编程语言都具继承这一机制,而 JavaScript 是基于原型(Prototype)面向对象程序设计,所以它的实现方式也是基于原型(Prototype)实现的. 继承的方式 类式继承 构造函数继承 组合继承 原型式继承 寄生式继承 寄生组合式继承 1.类式继承 //声明父...

    forsigner 评论0 收藏0
  • javascript面向对象“多态”

    摘要:之前,本质上不能算是一门面向对象的编程语言,因为它对于封装继承多态这些面向对象语言的特点并没有在语言层面上提供原生的支持。所以在中出现了等关键字,解决了面向对象中出现了问题。 ES6之前,javascript本质上不能算是一门面向对象的编程语言,因为它对于封装、继承、多态这些面向对象语言的特点并没有在语言层面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以让我们以...

    JerryWangSAP 评论0 收藏0
  • JS面向对象程序设计继承实现 - 原型链

    摘要:简单回顾一下构造函数原型和实例对象之间的关系每个构造函数都有一个原型对象。找到生成构造函数的原型对象的构造函数,搜索其原型对象,找到了。 JS面向对象的程序设计之继承的实现 - 原型链 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。如有纰漏或错误,会非常感谢您的指出。文中绝大部分内容引用自《JavaS...

    zhaochunqi 评论0 收藏0
  • JS面向对象程序设计继承-继承实现-借用构造函数

    摘要:面向对象的程序设计之继承继承的实现借用构造函数前言最近在细读高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。继承了注意,这一段代码借调了超类型的构造函数。 JS面向对象的程序设计之继承-继承的实现-借用构造函数 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下...

    duan199226 评论0 收藏0
  • PHP面试面向对象(1)

    摘要:二面向对象有什么特征面向对象的主要特征有抽象继承封装和多态。析构函数析构函数是在引入的,它的作用与调用时机和构造函数刚好相反,它在对象被销毁时自动执行。 PHP面试专栏正式起更,每周一、三、五更新,提供最好最优质的PHP面试内容。PHP中面向对象常考的知识点有以下7点,我将会从以下几点进行详细介绍说明,帮助你更好的应对PHP面试常考的面向对象相关的知识点和考题。整个面向对象文章的结构涉...

    phodal 评论0 收藏0

发表评论

0条评论

魏明

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<