几种常见的继承

原文地址:http://blog.csdn.net/caoyafeicyf/article/details/53354112

嘎嘎

常见的继承有扩展原型对象实现继承、替换原型对象实现继承、混入继承、混入+原型继承、经典继承、借用构造函数实现继承这六种。每个人的叫法可能不同,但是原理都一样。

扩展原型对象实现继承

实现原理:函数有一个prototype的属性(原型对象),通过给这个原型对象添加一个属性、方法,从而可以让构造函数的实例可以访问到

function Person(){}
Person.prototype.name="Jim";
Person.prototype.sayHello=function () {
    console.log("Hello");
}

var p1=new Person();
console.log(p1.name) //输出"Jim"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

替换原型对象实现继承

上面这种方式是最简单的也是最好理解的,但是有缺点,设置少数的属性或者方法还可以,但是要是设置多个呢?这种继承方法就不行了,太麻烦了,于是有了这种继承方式:替换原型对象实现继承。用于多个属性、方法的实现。

function Person () {}
Person.prototype={
   constructor:Person,
   a1:function () {},
   a2:function () {},
   a3:function () {},
   a4:function () {},
   a5:function () {},
   .......
}
var p1=new Person();
p1.a1();
p1.a2();
.......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

注意:使用这种方式继承,必须要加上constructor:Person:Person这个属性,因为Person.prototype会将原型对象的这个属性替换掉,如果不加上,值将不指向构造函数。

混入继承

使用场景:已知对象o1,o3,需要将o1中的属性、方法拷贝到o3里面。

var o1={name:"张三",age:18,height:180};
var o2=function () {};
o2.prototype.a="a";
var o3=new o2();
//功能封装
function mixin(target,source) {
   for(var key in source) {
      target[key]=source[key];
   }
   return target;
}

mixin(o3,o1)//这样o3里面就有了o1的属性和方法了。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意:jQuery里面的extend方法就是这个原理实现的。

混入+原型继承

利用混入继承向原型对象中添加属性和方法,其本质还是用了混入继承封装的方法

function Person () {};
Person.prototype.extend=function (source) {
   mixin(Person.prototype,source);
}

Person.prototype.extend({a:20,b:25,c:30});
//其实就相当于Person.prototype.a=20;Person.prototype.b=25......

var p1=new Person();
//p1就可以直接访问p1.a;p1.b了。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意:在jQ中,如果你想要在jQ上面添加方法,用的是$.fn.extend(),其实它就相当于jquery.prototype.extend()

经典继承

由道格拉斯提出。使用场景:已知一个对象o,需要创建一个新的对象,这个新的对象继承自对象o。

//功能封装
function create(o) {
    function F(){}
    F.prototype=o;
    return new F();
}

var o={name:"张三",age:18};
var o2=create(o);//这样o2就继承自o了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

借用构造函数实现继承

使用场景:子类构造函数借用父类构造函数来完成,给子类的实例添加属性。

function f1(name,age){
   this.name=name;
   this.age=age;
}

function f2(name,age,length) {
    f1.call(this,name,age)
    this.length=length;
}

var ff2=new f2("张三",23,180);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

总结:这几种方法原理虽然不难,但是难的是如何灵活运用,这个也没办法,只能自己实践。

1
时间: 2024-10-05 03:56:20

几种常见的继承的相关文章

[2]工欲善其事必先利其器-------UML中的几种常见关系(二)

目录 1.UML类图中几种常见的关系 经过(一)中介绍,我选择的是StarUML作为UML的学习工具,个人喜好,至少在功能上能够满足我现在的需求, 在介绍StarUML的使用之前首先介绍下UML中几种常见的关系: UML类图中常见的关系按照关系的强弱可分为:泛化 ,实现 ,组合, 聚合 , 依赖这几种 1.泛化关系:是一种继承关系,也就是XX is a kind of XX 描述. 2.实现关系:是一种类与接口的关系. 3. 组合关系:是一种强关联,属于一种整体与部分的关系,但是部分不能离开整体

对几种常见设计模式的理解

 转自:  http://blog.csdn.net/dengpeng0419/article/details/48110841 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 最早提出"设计模式"概念的是建筑设计大师亚力山大Alexander.在1970年他的<建筑的永恒之道>里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现.在<建

java之 ------ 几种常见的简单设计模式

前言: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.用于解决特定环境下.重复出现的特定问题的解决方案.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的

C# 实现AOP 的几种常见方式

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获.性能监控等 AOP的本质是通过代理对象来间接执行真实对象,在代理类中往往会添加装饰一些额外的业务代码,比如如下代码: class RealA { public virtual string Pro { get; set; } public virtual void ShowHello(string

Java几种常见的编码方式

Java综合 几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言.由于人类的语言有太多,因而表示这些语言的符号太多,无法用计算机中一个基本的存储单元—— byte 来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解.我们可以把计算机能够理解的语言假定为英语,其它语言要能够在计算机中使用必须经过一次翻译,把它翻译成英语.这个翻译的过程就是编

JAVA几种常见的编码格式(转)

简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Java 中经常遇到的几种编码格式的区别:Java 中经常需要编码的场景:出现中文问题的原因分析:在开发 Java web 程序时可能会存在编码的几个地方,一个 HTTP 请求怎么控制编码格式?如何避免出现中文问题? 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答

Andorid 内存溢出与内存泄露,几种常见导致内存泄露的写法

内存泄露,大部分是因为程序的逻辑不严谨,但是又可以跑通顺,然后导致的,内存溢出不会报错,如果不看日志信息是并不知道有泄露的.但是如果一直泄露,然后最终导致的内存溢出,仍然会使程序挂掉.内存溢出大部分是关于图片的请求,然后又没有及时的释放内存,而导致的内存泄露. 下面是几种常见的导致内存泄露的写法.有些是收集的别的地方的,我也是看到才知道自己写错了,分享一下吧 1.单例造成的内存泄漏 大家都喜欢用Android的单例模式,不过使用的不恰当的话也会造成内存泄漏.因为单例的静态特性使得单例的生命周期和

几种常见的CSS布局

本文概要 本文将介绍如下几种常见的布局: 其中实现三栏布局有多种方式,本文着重介绍圣杯布局和双飞翼布局.另外几种可以猛戳实现三栏布局的几种方法 一.单列布局 常见的单列布局有两种: header,content和footer等宽的单列布局 header与footer等宽,content略窄的单列布局 1.如何实现 对于第一种,先通过对header,content,footer统一设置width:1000px;或者max-width:1000px(这两者的区别是当屏幕小于1000px时,前者会出现

图像处理之三种常见双立方插值算法

http://blog.csdn.net/jia20003/article/details/40020775 图像处理之三种常见双立方插值算法 双立方插值计算涉及到16个像素点,其中(i', j')表示待计算像素点在源图像中的包含 小数部分的像素坐标,dx表示X方向的小数坐标,dy表示Y方向的小数坐标.具体 可以看下图: 根据上述图示与双立方插值的数学表达式可以看出,双立方插值本质上图像16个像素点 权重卷积之和作为新的像素值. 其中R(x)表示插值表达式,可以根据需要选择的表达式不同.常见有基