温故而知新 XD

1. 关于原型和构造函数的几个知识要点:

  1. 使用new 操作符调用构造函数,会经历以下四个步骤:

    1.1. 创建一个新对象;

    1.2. 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);

    1.3. 执行构造函数中的代码(为这个新对象添加属性);

    1.4. 返回新对象。
  2. 当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性:__proto__),指向构造函数的原型对象(所以可以在构造函数的 prototype 里存放实例公用的方法)。
  3. 每当代码读取某个对象的某个属性时,都会进行一次搜索,目标是具有给定名字的属性。搜索从对象实例本身开始。如果在实例中找到了该属性,则 return 该属性的值;如果没有找到,则搜索内部指针指向的原型对象( __proto__ ),若找到,则 return 该属性值;若没找到,继续搜索原型的原型...

2. 实现

给出父类 Animal,实现子类Cat:

function Animal (name) {
this.name = name
this.brother = 'Tony'
} Animal.prototype.eat = function (thing) {
console.log(this.name + ' eat ' + thing);
}

2.1 组合继承(结合原型链和借用构造函数,不太完美)

function Cat (name) {
Animal.call(this,name) // 借用构造函数,继承父类属性
this.sister = 'May'
} Cat.prototype = new Animal() // 原型链,继承父类方法
/* 在prototype继承了父类实例的全部属性,存在冗余。属性的继承已经在构造函数内通过调用父类构造函数实现。
实际上,子类的prototype需要的只是父类实例中指向父类原型的内部指针: Cat.prototype.__proto__ = Animal.protype */ console.log(Cat.prototype)
// {name: undefined(冗余), brother: "Tony"(冗余), constructor: ƒ} Cat.prototype.constructor = Cat // 由于上面 Cat.prototype 进行了赋值,所以需要重新指定其构造函数。
// 这一步对 instanceof 无影响,因为 "instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性" ;影响的是Cat实例的constructor 属性。
// 如果不做这一步:var Tom = new Cat('Tom'); Tom.constructor ==> Animal

2.2 寄生组合继承(完美)

function Cat (name) {
Animal.call(this,name)
this.sister = 'May'
} function createObject (obj) { /* 创建一个新对象,使用现有的对象来提供新创建的对象的__proto__ ,相当于 Object.create() */
function F () {}
F.prototype = obj
return new F()
} Cat.prototype = createObject (Animal.prototype)
// 相当于 Cat.prototype = Object.create(Animal.prototype) console.log(Cat.prototype)
// {constructor: ƒ} Cat.prototype.constructor = Cat

2.3 ES6语法

class Animal {
constructor(name){
this.name = name
this.brother = 'Tony'
} eat(thing) {
console.log(this.name + ' eat ' + thing);
}
} class Cat extends Animal {
constructor(name) {
super(name)
/* super()表示调用父类构造函数,this指向子类。只有调用super之后,才可以使用this关键字,否则新建实例时会报错。*/
/* 另:super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。通过super调用父类方法时,方法内部this指向子类;对super的猴哥属性赋值时,super就是this,赋值的属性会变成子类实例的属性 (不清楚里面是什么魔法)*/ this.sister = 'May'
}
}

温习js中对象的继承的更多相关文章

  1. js中对象转化成字符串、数字或布尔值的转化规则

    js中对象可以转化成 字符串.数字.布尔值 一.对象转化成字符串: 规则: 1.如果对象有toString方法,则调用该方法,并返回相应的结果:(代码通常会执行到这,因为在所有对象中都有toStrin ...

  2. 【转载】js中对象的使用

    原文链接:http://www.jb51.net/article/90256.htm[侵删] 简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一 ...

  3. [转]JS中对象与字符串的互相转换

    原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: thr ...

  4. JS中对象与字符串的互相转换

    在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON ...

  5. js中对象的一些特性,JSON,scroll家族

    一.js中对象的一些特性 对象的动态特性 1.当对象有这个属性时,会对属性的值重写 2.当对象没有这个属性时,会为对象创建一个新属性,并赋值 获得对象的属性的方式 为元素设置DOM0级事件 二.JSO ...

  6. JS 中对象的简单创建和继承

    对象的简单创建 1.通过对象直接量创建 比如 var obj = {}; 2.通过new 创建 比如 var obj = new Object(); // 相当于var obj = {}; var a ...

  7. JS中对象继承方式

    JS对象继承方式 摘自<JavaScript的对象继承方式,有几种写法>,作者:peakedness 链接:https://my.oschina.net/u/3970421/blog/28 ...

  8. JS中原型链继承

    当我们通过构造函数A来实现一项功能的时候,而构造函数B中需要用到构造函数A中的属性或者方法,如果我们对B中的属性或者方法进行重写就会出现冗杂的代码,同时写出来也很是麻烦.而在js中每个函数都有个原型, ...

  9. [转] JS中简单的继承与多态

    这里讲了一个最最最简单的JS中基于原型链的继承和多态. 先看一下以下这段代码的实现(A是“父类”,B是“子类”): var A = function(){ this.value = 'a'; this ...

随机推荐

  1. Paper Reading - Convolutional Image Captioning ( CVPR 2018 )

    Link of the Paper: https://arxiv.org/abs/1711.09151 Motivation: LSTM units are complex and inherentl ...

  2. 十面阿里,七面头条,六个Offer,春招结束

    作者:jkgeekjack链接:https://www.nowcoder.com/discuss/80156?type=0&order=0&pos=13&page=2来源:牛客 ...

  3. 2019寒假训练营第三次作业part2 - 实验题

    热身题 服务器正在运转着,也不知道这个技术可不可用,万一服务器被弄崩了,那损失可不小. 所以, 决定在虚拟机上试验一下,不小心弄坏了也没关系.需要在的电脑上装上虚拟机和linux系统 安装虚拟机(可参 ...

  4. 福大软工1816 · 第五次作业 - 结对作业2_map与unordered map的比较测试

    测试代码: #include <iostream> using namespace std; #include <string> #include <windows.h& ...

  5. lintcode-143-排颜色 II

    143-排颜色 II 给定一个有n个对象(包括k种不同的颜色,并按照1到k进行编号)的数组,将对象进行分类使相同颜色的对象相邻,并按照1,2,...k的顺序进行排序. 注意事项 You are not ...

  6. 数据库性能优化之SQL优化

    网上有关SQL优化的方案有很多,但多是杂乱无章.近日闲暇抽空整理了一下,方便大家以后的查阅,若发现其中有什么问题和不全,欢迎大家在下面纠正和补充: 1. 对于SQL语句的性能优化,主要体现在对于查询语 ...

  7. 敏捷冲刺Day2

    一. 每日会议 1. 照片 2. 昨日完成工作 网页设计与实现的完善 服务器的搭建前期--申请域名 激活域名 搭建服务器 分析接下来的任务与进度 总结前两天的工作 对产品的进一步展望 3. 今日完成工 ...

  8. 枚举当前环境中打开的所有IE

    IE程序是属于Shell的一个应用程序,要枚举当前打开的所有IE程序窗口,可以通过ShellWindows集合来打开属于Shell的当前的窗口的集合. 首先添加程序需要的头文件和tlb库 //#imp ...

  9. java 当读取的结果为-1时候说明已经读取结束了

    当读取的结果为-1时候说明已经读取结束了

  10. connectedSignal 简单使用

    import java.util.concurrent.CountDownLatch; public class CountDown { private static CountDownLatch c ...