2019独角兽企业重金招聘Python工程师标准>>>

写读书笔记的好处在于加深记忆,前一篇总结了编程中创建的对象的几种方式,以及常用的方式,这一篇总结实现继承的方式: 1、对象冒充:

function ClassA(sColor) {

this.color = sColor;this.sayColor = function () {alert(this.color);};

}

function ClassB(sColor, sName) {

this.newMethod = ClassA;this.newMethod(sColor);delete this.newMethod;this.name = sName;this.sayName = function () {alert(this.name);};

}

var objA = new ClassA("blue");

var objB = new ClassB("red", "John");

objA.sayColor(); //输出 "blue"

objB.sayColor(); //输出 "red"

objB.sayName(); //输出 "John"

对象冒充可以实现多重继承:

function ClassZ() {

this.newMethod = ClassX;this.newMethod();delete this.newMethod;this.newMethod = ClassY;this.newMethod();delete this.newMethod;

}

ECMAScript 的第三版为 Function 对象加入了两个方法,即 call() 和 apply()

2、使用call()方法(与经典的对象冒充方法最相似的方法)

function sayColor(sPrefix,sSuffix) {

alert(sPrefix + **this.color** + sSuffix);

};

var obj = new Object();

obj.color = "blue";

sayColor.call(obj, "The color is ", "a very nice color indeed.");

里面的this.color的this就是obj

function ClassB(sColor, sName) {

//this.newMethod = ClassA;//this.newMethod(color);//delete this.newMethod;ClassA.call(this, sColor);//执行对象ClassA里面的this.color和this.sayColor语句,而且this代表传入的ClassB,这样就为ClassB添加了两个成员this.name = sName;this.sayName = function () {alert(this.name);};

}

3、使用apply()方法

apply方法和call方法很类似,

apply方法的使用如下:

function sayColor(sPrefix,sSuffix) {

alert(sPrefix + this.color + sSuffix);

};

var obj = new Object();

obj.color = "blue";

sayColor.apply(obj, new Array("The color is ", "a very nice color indeed."));

创建ClassB的时候可以使用:

(1) function ClassB(sColor, sName) {

//this.newMethod = ClassA;//this.newMethod(color);//delete this.newMethod;ClassA.apply(this, new Array(sColor));this.name = sName;this.sayName = function () {alert(this.name);};

}

(2) function ClassB(sColor, sName) {

//this.newMethod = ClassA;//this.newMethod(color);//delete this.newMethod;ClassA.apply(this, arguments);this.name = sName;this.sayName = function () {alert(this.name);};

}

可以看到只是出入对象的参数不同而已的,使用的数组或者arguments

4、使用原型链

(1) function ClassA() {

}

ClassA.prototype.color = "blue";

ClassA.prototype.sayColor = function () {

alert(this.color);

};

function ClassB() {

}

ClassB.prototype = new ClassA();

(2)

function ClassB() {

}

ClassB.prototype = new ClassA();

//如果上面的这句代码(ClassB.prototype = new ClassA(); ),在下面的两句代码之后的话,那么添加的name,sayName成员都会丢失

ClassB.prototype.name = "";

ClassB.prototype.sayName = function () {

alert(this.name);

};

所以在使用这种方式的时候要注意顺序

使用原型链的时候还可以使用instanceof: var objB = new ClassB();

alert(objB instanceof ClassA); //输出 "true"

alert(objB instanceof ClassB); //输出 "true"

但是使用原型链的弊端是不支持多重继承,原型链会用另一类型的对象重写类的 prototype 属性。

5、混合方式

如果用对象冒充的话就必须使用构造函数方法,所以不是最好的选择,但是使用原型链的话无法使用带参数的构造函数 ,比如使用原型链里面的(2)代码,ClassA如果是构造函数,那么创建对象的时候就要先执行 ClassB.prototype = new ClassA(XXX);
再执行: ClassB.prototype.name = "";

ClassB.prototype.sayName = function () {

alert(this.name);

};

这样是不现实的,因为你是先把ClassB的原型方法定义好了的,使用的时候要直接创建实例 ,这样就不能参数传入ClassA,所以最后采用了混合方式(如下)

function ClassA(sColor) {

this.color = sColor;

}

ClassA.prototype.sayColor = function () {

alert(this.color);

};

function ClassB(sColor, sName) {

ClassA.call(this, sColor);this.name = sName;

}

ClassB.prototype = new ClassA();

ClassB.prototype.sayName = function () {

alert(this.name);

};

使用这种方式的时候,可以通过创建ClassB时候传入的参数再传入到ClassA里面使用。

学习小结:

   所以最常用的实现继承的方式是混合方式,有原型链也有冒充方式。

转载于:https://my.oschina.net/u/933915/blog/306663

javascript高级编程学习笔记(二)——继承相关推荐

  1. JavaScript高级程序设计学习笔记二(在HTML中使用JavaScript)

    在 HTML 中使用 JavaScript 在html中使用JavaScript脚本有两种方式一种是嵌入在HTML中的脚本,另一种是引入外部的脚本.两种方式都离不开<script>元素. ...

  2. Javascript高级编程学习笔记(20)—— 创建对象

    由于今天有点事,加上对象原型链的东西有点多,所以今天这篇就讲一个小的知识点吧 也算为明天的对象继承做铺垫 工厂模式 虽然使用对象字面量来创建一个对象十分地便捷,但是这个方法有一个显著的缺点 那就是如果 ...

  3. JavaScript高级程序设计学习笔记(三)

    分享一下第五章(引用类型)的笔记,内容比较多,我拆成了两部分,今天这部分是关于Object.Array.Date和RegExp类型的. 以下的笔记是书上一些我以前学习的时候,没有太重视的js基础知识, ...

  4. 【C#8.0 and .NET Core 3.0 高级编程学习笔记】

    @C#8.0 and .NET Core 3.0 高级编程学习笔记 前言 为了能精细地完成对C#语言的学习,我决定选择一本书,精读它,理解它,记录它.我想选择什么书并不是最重要的,最重要的是持之以恒的 ...

  5. 网易云课堂微专业--Java高级开发工程师--多线程并发编程--学习笔记(二)

    文章目录 第一章 多线程并发编程 第二节 线程安全问题 1.2.1 线程安全之可见性问题 多线程中的问题 从内存结构到内存模型 工作内存缓存 指令重排序 内存模型的含义 Shared Variable ...

  6. Windows高级编程学习笔记(一)

    写在前面的话 之前学的Windows编程都是界面啊.网络编程啊之类的纯应用层面的东西,总是感觉而自己没有达到自己期望中的水平.什么水平呢?如果让你编写监控系统资源的工具,或者DLL注入相关软件,或者底 ...

  7. javascript高级程序设计学习笔记

    javascript高级程序设计,当枕头书已经好久了~zz  现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...

  8. javascript高程3 学习笔记(二)

    ECMAScript function的理解 ECMAScript 函数与其他语言函数最大的不同在于,其不介意传入多少参数以及参数的类型 比如函数的形参有两个,但是调用函数传入的参数可以写一个,三个或 ...

  9. 高级编程学习笔记day01(知识点篇)

    文件IO学习笔记 1. 文件描述符:所有打开的文件都通过文件描述符引用.     文件描述符0与进程的标准输入关联     文件描述符1与进程的标准输出关联     文件描述符2与进程的标准错误关联 ...

最新文章

  1. php 自定义表格并统计,PHP 使用Echarts生成数据统计报表的实现
  2. java版DVD影碟片出租赁系统C/S模式 java电影购票系统课程设计
  3. casperjs ajax请求,Casperjs ajax调用 - waitForResource和解析错误
  4. OAuth(开放授权):(第三方)通过(授权)令牌(Access Token)访问用户数据
  5. Weblogic二种修改端口的方法(转)
  6. poj1251 Jungle Roads Kruskal算法+并查集
  7. centos php mysql 5.6 安装_centos 6.8 yum安装 PHP 5.6
  8. node 16位 转24位_同时将24位和32位BMP图像顺时针旋转90度
  9. 【渝粤教育】10259k2_经济学基础_21秋考试
  10. 访问对象的属性,你知道有哪些方法?
  11. 创远家居基于江湖家居装修门户PHP系统源码
  12. ubuntu配置安装KBEngine服务器
  13. 【Kafka】kafka-eagle几个指标含义
  14. Google的Java常用类库 Guava
  15. 【C++编程技巧】函数多个返回值
  16. Spark生态之Alluxio学习15--alluxio性能分析和加速方式
  17. JAVA实现字体扩大代码_[Java教程]jQuery实现设置字体大小代码实例
  18. SD卡格式化造成数据丢失的恢复方法
  19. 国内外sns源码搜集
  20. CodeForces 68 A.Irrational problem(水~)

热门文章

  1. python可以神奇的做什么_可以用 Python 编程语言做哪些神奇好玩的事情?
  2. [Ext JS]5.11 轻量版的树- treelist
  3. Java Web项目在Linux服务器自动化部署续-整合Bamboo
  4. JAVA泛型只能用引用类型_Java泛型和设计模式:不参数化对泛型类型的引用总是一件坏事吗?...
  5. Spring boot Rabbitmq 示例
  6. python函数降低编程复杂度_Python-面向对象编程
  7. STM32之PWM波
  8. 画图标签和图大小_Matpltolib图鉴基础饼图
  9. Python发送POST request payload形式的请求
  10. JavaSE----常用类(String、StringBuilder、StringBuffer)