写这篇有关继承的文章时,突然想起,几天前的面试。因为习惯在学习知识的时候加上自己的理解,很喜欢用自己话来解释,于是乎当面试被问起继承原理时,噼里啪啦一大堆都是自己组织的话,(也可能是因为个人紧张、外加是电面,各种因素掺杂,导致了表述不清),不管怎么然后面试官就被迷茫了。so sorry~私下里可以用“俚语”解释给自己听,一上场面还是需要“官方官言”的。这也算是一种态度。

  

  依然相信绝大多数东西的存在都是有原因的。~

  为什么要继承?

  减少重复性的代码,并且尽量弱化对象间的耦合。

  类式继承

  通过用函数来声明类、用关键字new来创建实例。

  首先创建构造函数,其名称就是类名,首字母应大写。在构造函数中,创建实例属性要使用关键字this。

function Person(name) {
this.name = name;
} Person.prototype.getName = function() {
return this.name;
}; var reader = new Person("Jsno");
reader.getName(); function Author(name,books) {
Person.call(this,name);
this.books = books;
}
Author.prototype = new Person(); //重写原型链
Author.prototype.constructor = Author;
Author.prototype.getBooks = function() {
return this.books;
};

  原型式继承

var Person = {  //所有创建的其它各种类Person对象的原型对象
name: 'default name',
getName: function() {
return this.name;
}
}; var Author = clone(Person);
Author.books = [];
Author.getBooks = function() {
return this.books;
} function clone(object) {
function F() {}
F.prototype = object;
return new F;
}

  类式继承和原型继承的对比:

  原型继承更能节约资源。原型链读取成员的方式使得所有克隆出来的对象都共享每个属性和方法的唯一一份实例,只有在直接设置了某个克隆出来的对象的属性和方法时,情况才会有所变化。与此相比,在类似继承方法中创建的每一个对象在内存中都有自己的一套属性(和私用方法)的副本。原型继承在这方面的节约效果突出。这种继承也比类式继承显得更为简练。它只用到了一个clone函数,不像后者那样需要为每一个想扩展的类写上好几行像SuperClass.call(this,arg)和SubClass.prototype = new SuperClass。~原型继承所要注意的一个问题就是,万一不小心修改了原型,则会反映到所有继承了该原型的对象中。

深入js的面向对象学习篇(继承篇)——温故知新(三)的更多相关文章

  1. 深入js的面向对象学习篇——温故知新(一)

    在学习设计模式前必须要知道和掌握的***. 为类添加新方法: Function.prototype.method = function(name,fn) { this.prototype[name] ...

  2. 深入js的面向对象学习篇(封装是一门技术和艺术)——温故知新(二)

    下面全面介绍封装和信息隐藏. 通过将一个方法或属性声明为私用的,可以让对象的实现细节对其它对象保密以降低对象之间的耦合程度,可以保持数据的完整性并对其修改方式加以约束.在代码有许多人参与设计的情况下, ...

  3. C++学习之继承篇

    今天通过对实验二继承,重载,覆盖的学习,让我更深一步理解了这些概念的区别. 首先来明确一个概念,函数名即地址,也就是说函数名就是个指针. 编译阶段,编译器为每个函数的代码分配一个地址空间并编译函数代码 ...

  4. typescript 的 polyfill 学习1-Class 继承篇

    Class 继承 js 是多范式的编程语言,同样也是支持面向对象编程的,类 是面向对象中是很重要的概念. 区别于传统的java,c#基于模板的类,js是基于原型的. 类继承一般是通过原型链的方式来实现 ...

  5. 【js】面向对象学习资料

    1.面向对象模式: https://m.jb51.net/article/74549.htm 2.面向对象基础篇 http://www.cnblogs.com/chiangchou/p/js-oop1 ...

  6. JavaScript之面向对象学习八(继承)

    简介:继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法. 但是JS的函数并没有签名,所以在ECMASc ...

  7. JS高级程序设计学习笔记——继承

    我们知道,在OO语言中,继承可分为接口继承和实现继承.而ECMAScript的函数没有签名,不能实现“接口继承”,只能通过原型链实现“实现继承”. 在学习了各种继承模式之后,简单总结一下各种继承模式的 ...

  8. JS高级 - 面向对象5(继承,引用)

    <script type="text/javascript"> //------------------Person类 //(Person)的构造函数 function ...

  9. JS中面向对象中的继承(常用写法)---核心部分

    1.基本概念 子类继承父类,但是不能影响父类.包括1.混合继承(构造函数+原型) 2.ES6新增class的继承. 接下来介绍,面向对象中继承的两种常用写法.即混合继承(构造函数+原型)和class继 ...

随机推荐

  1. MyBatis(3.2.3) - Mapped statements: The INSERT statement, Autogenerated keys

    We can use the useGeneratedKeys and keyProperty attributes to let the database generate the auto_inc ...

  2. Nginx - HTTP Configuration, Module Variables

    The HTTP Core module introduces a large set of variables that you can use within the value of direct ...

  3. 百练 2973 Skew数 解题报告

    思路: 计算出每一个skew数的不同位数表示的权值,然后用该位与权值相乘.用int数组来装权值,用char数组来装skew数. 代码: #include<stdio.h> #include ...

  4. Android Studio 快捷方式

    Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码(如g ...

  5. fuse挂载hdfs目录到linux本地

    1,安装fuse yum -y install hadoop-hdfs-fuse 2.修改环境变量 vi /etc/profile 增加如下配置: JAVA_HOME=/usr/jdk64/jdk1. ...

  6. sqlserver中关于merge

    merge: 在2008后被引入,它能将insert,Update,delete 简单并为一句,根据与源表连接的结果,对目标表进行插入,更新和删除操作例如:Merge是关于对于两个表之间进行操作的 C ...

  7. 关于MySql entity framework 6 执行like查询问题解决方案

    原文:关于MySql entity framework 6 执行like查询问题解决方案 本人不善于言辞,直接开门见山 环境:EF6.0.0.0+MySQL Server5.6+MySqlConnec ...

  8. Contoso 大学 - 9 - 实现仓储和工作单元模式

    原文 Contoso 大学 - 9 - 实现仓储和工作单元模式 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Micros ...

  9. spring自定义注解

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  10. [GeekBand] 面向对象的设计模式(C++)(2)

    本篇笔记紧接上篇,继续学习设计模式. 4. 对象创建类设计模式 通过对象创建模式绕开new,来避免对象创建(new)过程中所导致的紧耦合,从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 4.1 ...