我们先想想我们用js最后要怎样实现面向对象的编程。事实上我们必须用上原型链这种东西。

我们的父类superType有属性和方法,并且一些能被子类subType继承,一些能被覆盖,但是丝毫不会影响到父类。那么我们可以这样定义:父类子类同时拥有独立的属性,但是共享父类被继承的方法。

继承是靠prototype实现的。

class实现

我们最理想化的js面向对象es6已经帮我们做出来了,我们可以先试下es6的,然后再用es5实现这种效果。

class Person {
constructor(age) {
this.age = age;
}
getAge() {
console.log(`${this.age} yrs old`);
}
}
class Student extends Person{
constructor(name, age) {
super(age);
this.name = name;
}
getName() {
console.log(`his name is ${this.name}`);
}
}
var person1 = new Person(11);
var tom = new Student('tom',16)

可见,Person作为父类,拥有age和getAge()两个可以被继承的属性和方法,子类Student调用super()就可以继承他的属性age,并且拥有自己独立的属性name,两者的属性不冲突,以及共有的方法getAge(),独立方法getName()。

到这里我们还看不出什么眉目,因为看起来是如此的简单。现在我们来复杂化一下,来看这里涉及的prototype和constructor。

分析

由Person新建出来的对象person1,person1.constructor是Person,person1.[[prototype]]是{constructor,getAge},而Person.prototype也是{constructor,getAge},而Person.prototype.constructor是Person;

由Student新建的对象tom,tom.constructor是Student,tom.[[prototype]]是{constructor,getName},Student.prototype也是{constructor,getName},Student.prototype.constructor是Student,来到这里,没什么不同,但是原型链的魅力就在于,原型可以串成一条链,此时为什么tom能访问到getAge这个函数,正是因为tom的原型{constructor,getName}里还有一个原型{constructor,getAge},也就是tom.[[prototype]].[[prototype]]是Person.prototype。

传统方法实现

弄到这里我们清楚我们要怎么做了。就是新建一个构造函数,指定它的属性和原型函数。然后把它的原型弄出来作为一个新的对象,将这个对象的constructor指定为新的构造函数,这样新的prototype就做好了,大家可以共用方法。再来新建一个构造函数,用call方法借用父类构造函数,复制它的属性,在把prototype指定为刚刚建好的prototype。这样就大功告成,新的子类拥有父类的属性,并且不影响父类的属性,还能有自己的属性,同时继承了父类的方法,不必重复声明相同的函数浪费空间。


/**
* 寄生组合
*/
// 复制一个对象作为新对象的prototype,返回新对象
function object(o) {
function F(){};
F.prototype = o;
return new F();
}
// 复制父类的原型作为新的原型,新的原型指定子类为构造函数,子类指定新的原型为原型
function inheritPrototype(subType, superType) {
var prototype = object(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
}
// 父类属性
function Person(age) {
this.age = age;
this.course = ['english','math'];
}
// 父类原型
Person.prototype.getAge = function() {
console.log(`${this.age} yrs old`);
}
// 子类,借用函数复制父类属性
function Student(name, age) {
Person.call(this, age);
this.name = name;
}
// 给子类以父类的原型
inheritPrototype(Student, Person);
// 定义子类的原型方法
Student.prototype.getName = function() {
console.log(`his name is ${this.name}`);
}
var tom = new Student('tom',16)

个人愚见,不喜勿喷,欢迎指导和交流。

【前端笔记】浅谈js继承的更多相关文章

  1. 浅谈JS继承

    今天呢,我们来谈谈继承,它也是JS语言中的一大重点,一般什么时候我们会用继承呢,比如有两个拖拽的面板,两个功能基本一致,只是第二个面板多了一些不同的东西,这个时候,我们就会希望,要是第二个直接能继承第 ...

  2. 浅谈JS面向对象

    浅谈JS面向对象 一 .什么是面向过程 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了.注重代码的过程部分. 二.什么是面向对象 最先出现在管理学 ...

  3. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  4. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  5. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  6. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  7. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  8. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

  9. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...

随机推荐

  1. 20165218 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.16 实验密级:Java开发环境的熟悉 实验内容.步骤与体会: ...

  2. position:fixed 相对父元素定位

    position:fixed是对于浏览器窗口定位的,要实现相当于父元素定位,可以这样: 不设置fixed元素的top,bottom,left,right,只设置margin来实现. 这种方法本质上fi ...

  3. 最近遇到的DISCUZ一些问题解决方法

    “抱歉,您的请求来路不正确或表单验证串不符,无法提交” 打开“source\class\helper\helper_form.php”, 然后把“$_GET[‘formhash’] == formha ...

  4. css样式表设置

    有参考此片博文 1.内联式样式表 是指将CSS样式编码写在HTML标签中,在标签内编写的样式能影响的范围最小,只改变本标签的文字样式,同样的标签不会受到影响,也称行间样式表. 格式如下 <h1 ...

  5. Tests for normality正态分布检验

    欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/ ...

  6. jQuery常用插件大全

    1.五星级插件jRating 详细文档介绍:http://www.myjqueryplugins.com/jquery-plugin/jrating 2.图片展示插件Swiper和Slider swi ...

  7. 2015/11/1用Python写游戏,pygame入门(1):pygame的安装

    这两天学习数据结构和算法,有时感觉并不如直接做项目来的有趣.刚刚学完python的基本使用,现在刚好趁热打铁做个小项目. 由于本人一直很想制作一款游戏,就想使用Python制作一个基础的游戏.搜了一下 ...

  8. Python学习笔记(十五)用Python获取本地数据

    f1 = open(r'E:\Python\Data\data1.txt') #读取data1.txt文件,使用系统默认缓冲区大小, 为了读取快点,使用缓存吧! f = open(r'E:\Pytho ...

  9. javascript小技巧之with()方法

    With()方法平时用得不多,本文用个小例子来学习一下.在这里记录.个人感觉还是很方便的. 有了 With 语句,在存取对象属性和方法时就不用重复指定参考对象,在 With 语句块中,凡是 JavaS ...

  10. 推箱子 BFS

    [编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...