经典继承

js中实现经典继承的方式是通过构造函数来实现的,即在子类中对父类调用call方法。

  function Geometric() {
this.time = "";
this.color = "";
this.base = function () {
alert("Creating time is: " + this.time + " and color is: " + this.color)
}
} function Circle() {
Geometric.call(this);
this.radius = 0;
this.area = function () {
alert("the area is: " + Math.PI * this.radius * this.radius) }
}
function Rectangle() {
Geometric.call(this);
this.wi = 0;
this.he = 0;
this.area = function () {
alert("the area is: " + this.wi * this.he)
}
}
var instance1 = new Circle() instance1.time = "20xx.xx.xx"
instance1.color = "red"
instance1.radius = 0.3;
instance1.area()
instance1.base() var instance2 = new Rectangle()
instance2.time = "20xx.xx.xx"
instance2.color = "blue"
instance2.wi = 3;
instance2.he = 4;
instance2.area();
instance2.base();

  

组合继承

组合继承又称伪经典继承,是通过原型链(实现对原型属性和方法的继承) +借用构造函数(实现对实例属性的继承) 。

父类的方法定义在父类的原型上;子类中继续进行父类的call方法的调用;让子类的原型指向父类;子类的方法定义在子类原型上。

  //组合继承
//原型链+借用构造函数
function Geometric() {
this.time = "";
this.color = ""; }
//方法定义在构造函数的原型上
Geometric.prototype.base = function () {
alert("Creating time is: " + this.time + " and color is: " + this.color)
} function Circle() {
Geometric.call(this);
this.radius = 0; }
Circle.prototype = new Geometric()
Circle.prototype.area = function () {
alert("the area is: " + Math.PI * this.radius * this.radius)
}
var instance3 = new Circle();
instance3.time = "20xx.xx.xx"
instance3.color = "green";
instance3.radius = "20"
instance3.base();
instance3.area();

原型式继承

原型式继承使用了一个空函数对象F来作为原型链的中间变量。

父类的方法定义在父类的原型上;子类中继续进行父类call方法的调用;构造一个空函数对象F;让F的原型=父类的原型;子类的原型=F;子类原型的构造函数=子类;子类的方法构造在子类原型上。

  //原型式继承
//使用一个空函数F来当做中间对象
function Geometric() {
this.time = "";
this.color = ""; }
//方法定义在构造函数的原型上
Geometric.prototype.base = function () {
alert("Creating time is: " + this.time + " and color is: " + this.color)
}
function Circle() {
Geometric.call(this);
this.radius = 0; } function F() { }
F.prototype = Geometric.prototype;
Circle.prototype = new F()
Circle.prototype.constructor = Circle(); Circle.prototype.area = function () {
alert("the area is: " + Math.PI * this.radius * this.radius)
} var instance4 = new Circle();
instance4.time = "2018.06.03"
instance4.color = "green";
instance4.radius = "20"
instance4.base();
instance4.area();
alert(instance4.__proto__ == Circle.prototype)
alert(instance4.__proto__.__proto__ == Geometric.prototype)

寄生继承

寄生继承了创建一个用于封装继承过程的函数。

创建一个继承函数;传入一个父类对象;在函数内构造该父类对象;在函数内创建子类;return该父类对象;

//寄生继承
//创建一个用于封装继承过程的函数
function createGeometric(g) {
var clone1 = Object(g);
clone1.createCircle = function (radius) {
this.radius = radius;
this.circleArea = function () {
alert("the area is: " + Math.PI * this.radius * this.radius) }
}
clone1.createRectangle = function (wi, he) {
this.wi = wi;
this.he = he;
this.rectangleArea = function () {
alert("the area is: " + this.wi * this.he);
}
}
clone1.base = function () {
alert("Creating time is: " + g.time + " and color is: " + g.color)
}
//最后要将新创建的对象return出去
return clone1
}
var g = {
time: "20xx.xx.xx",
color: "red"
} var Geometric = createGeometric(g); Geometric.base();
Geometric.createCircle(2.0);
alert(Geometric.circleArea())
Geometric.createRectangle(4, 5);
alert(Geometric.rectangleArea())

寄生组合继承

寄生组合继承避免了组合继承中的一些冗余现象。

组合继承中:子类中进行了父类call方法的调用;子类的原型指向父类;这样就会有一定的冗余。

寄生组合继承中,通过一个函数(此处写为inheritPrototype)来代替子类的原型指向父类这一过程

    //寄生组合继承,避免了组合继承中的冗余现象
function inheritPrototype(subType, superType) {
var protoType = Object.create(superType.prototype); //创建对象
protoType.constructor = subType; //增强对象
subType.prototype = protoType; //指定对象
} function Geometric() {
this.time = "";
this.color = ""; }
//方法定义在构造函数的原型上
Geometric.prototype.base = function () {
alert("Creating time is: " + this.time + " and color is: " + this.color)
} function Circle() {
Geometric.call(this);
this.radius = 0; }
//Circle.prototype = new Geometric()
inheritPrototype(Circle, Geometric)
Circle.prototype.area = function () {
alert("the area is: " + Math.PI * this.radius * this.radius)
}
var instance5 = new Circle();
instance5.time = "20xx.xx.xx"
instance5.color = "green";
instance5.radius = "20"
instance5.base();
instance5.area();

javascript学习笔记--经典继承、组合继承、原型式继承、寄生继承以及寄生组合继承的更多相关文章

  1. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  2. Java程序猿的JavaScript学习笔记(6——面向对象模拟)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  3. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  4. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  7. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  8. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  9. Java程序猿的JavaScript学习笔记(1——理念)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

随机推荐

  1. C++ -- 类与成员

    一.初始化列表 1.是构造函数中一种成员的初始化方式   例如,class    类名 { 类名(参数列表):成员1(成员1),成员2(成员2)... {   } } 2.用此方法可以解决类中的成员与 ...

  2. sqli-labs(36)

    0X01发现又是‘’被过滤了 ?id=%df%%20and%=%23 错误 ?id=1%df%27%20and%201=1%23 正确   存在注入 0X01爆数据库 ?id=-%df%%20unio ...

  3. C# Socket-TCP异步编程原理详解附源码

    目录 目录异步原理主要方法源码Server源码:Client源码实验效果(广播为例)参考博客 TOC 异步原理 套接字编程原理:延续文件作用思想,打开-读写-关闭的模式. C/S编程模式如下: Ø 服 ...

  4. AI-人工智能/机器学习 seetafaceJNI

    基于中科院seetaface2进行封装的JAVA人脸识别库,支持人脸识别.1:1比对.1:N比对. 项目介绍 基于中科院seetaface2进行封装的JAVA人脸识别算法库,支持人脸识别.1:1比对. ...

  5. ClientScriptManager.RegisterClientScriptBlock Method 无效

    ClientScriptManager.RegisterClientScriptBlock Method 这个方法不能在Render方法里面使用,但是可以在PreRender中使用 最好是放到OnLo ...

  6. mysql命令使用2

    mysql查询默认不区分大小写,如果需要区分大小写,使用binary mysql>select * from teacher where binary name='niu'; mysql查询默认 ...

  7. Flask- celery (芹菜)

    一.什么是Celery? 中文名翻译为芹菜,是flask中处理异步定时周期任务的第三方组件 二.基本结构 1.需要跑的任务代码app 2.用管道broker与用于存储任务(就是个缓存)  工具一般用r ...

  8. java dwg转svg

    package com.example.demo.dxf2svg; import com.aspose.cad.InterpolationMode; import com.aspose.cad.Smo ...

  9. Python 2 和 3 的区别及兼容技巧

    目录 目录 前言 Python 2 or 3 ? 不同与兼容 统一不等于语法 统一整数类型 统一整数除法 统一缩进语法 统一类定义 统一字符编码类型 统一导入模块的路径搜索方式 修正列表推导式的变量作 ...

  10. 测开之路一百三十三:实现sql函数封装

    连接数据库的频率很高,所以把数据库操作封装起来 函数封装: def make_dicts(cursor, row): """ 将游标获取的Tuple根据数据库列表转换为d ...