深入理解继承的实现方式不仅仅有利于自己去造轮子,封装插件,更有利于我们去阅读一些框架的源码,

以下记录几种常见的继承方式

1. 原型链实现继承

        function Father(){
this.name = "爸爸"
} Father.prototype.sayName = function(){
console.log(this.name)
} function Son(){
this.age = 18
//this.name = "儿子" 自己有就不会沿着原型链去找
} //子类原型对象指向父类实例实现继承
Son.prototype = new Father() //子类添加自己的原型方法 只能写在实例后面,不然会覆盖
Son.prototype.sayAge = function(){
console.log(this.age)
} var s1 = new Son()
s1.sayName()
s1.sayAge()
console.log(s1.name)

2. 构造函数实现继承

function Father(){
this.colors = ["red","yellow"]
this.sayColor = function(){
console.log(this.colors)
}
} function Son(){
this.age = 18
Father.call(this)
} var s1 = new Son()
s1.colors.push("blue")
s1.sayColor() var s2 = new Son()
s2.sayColor() //构造函数实现继承由于属性是在构造函数中,而不是原型中,说明这种方法没办法实现共享方法

3.组合继承

        function Father(name){
this.name = name
this.colors = ["red","yellow"]
} Father.prototype.sayName = function(){
console.log(this.name)
} function Son(name,age){
this.age = age
Father.call(this,name)
} Son.prototype = new Father() Son.prototype.constructor = Son //子类原型指向子类构造函数 Son.prototype.sayAge = function(){
console.log(this.age)
} var s1 = new Son("儿子",18)
s1.colors.push("blue")
console.log(s1.name)
console.log(s1.colors)
s1.sayName()
s1.sayAge() //实例共享的属性方法借用原型链实现,实例私有的属性方法借用构造函数实现

4. 冒充对象实现继承

        function Father(){
this.name = "爸爸"
this.sayName = function(){
console.log(this.name)
}
} function Son(){
this.temp = Father
this.temp() //执行这个方法,内部this指向实例化的对象,实现继承
delete this.temp //内部已实现继承,销毁这个属性
} var s1 = new Son()
s1.sayName()
console.log(s1)

5. 原型式继承

        function object(o){
function F(){}
F.prototype = o
return new F()
}
var person = {
name: "张强",
sayName: function(){
console.log(this.name)
}
}
var p1= object(person)
console.log(p1.name)
p1.sayName() //原型式继承所有属性方法全部在原型下,所有属性方法全部共享

6. 寄生式的继承

function createAnother(o){
var obj = object(o)
obj.sayHi = function(){
console.log("hi hi~")
}
return obj
} var p2 = createAnother(person)
console.log(p2.name)
p2.sayHi() //寄生式继承在原型式继承的基础上为新对象添加自己的属性方法

7. 寄生组合式继承

function inheritPrototype(subType,superType){
//利用中间变量实现子类的原型继承父类原型,而非父类的全部
var prototype = object(superType)
prototype.constructor = subType
subType.prototype = prototype
} function Father(name){
this.name = name
this.colors = ["red","yellow"]
}
Father.prototype.sayName = function(){
console.log(this.name)
} function Son(name,age){
this.age = age
Father.call(this,name)
} inheritPrototype(Son,Father) Son.prototype.sayAge = function(){
console.log(this.age)
} var s1 = new Son("二儿子",16)
s1.sayAge()
console.log(s1) //寄生组合式的继承能使 子类原型继承父类原型,子类构造函数继承父类构造函数的属性方法

那么问题来了,为什么不可以 Son.prototype = Father.prototype 来实现子类原型继承父类原型,好吧,我们来试试~

        function Father(name){
this.name = name
this.colors = ["red","yellow"]
}
Father.prototype.sayName = function(){
console.log(this.name)
} function Son(name,age){
this.age = age
Father.call(this,name)
}
Son.prototype = Father.prototype
Son.prototype.constructor = Son Son.prototype.sayAge = function(){
console.log(this.age)
}
var s1 = new Son("张强",27)
console.log(s1)
s1.sayName()
var f1 = new Father("冯博志")
console.log(f1)

咋一看好像可以实现继承,但是子类原型上的属性方法影响到父类的原型方法,这里就涉及到js的浅拷贝问题,当一个改变另一个随之改变,所以,这种方法是不可取的。

总结:

js实现继承的方法主要有这些,但主要的是组合方式和寄生组合方式,使用继承能使用父类的属性和方法,增加代码的可复用性。

js继承的方式的更多相关文章

  1. js继承的方式及其优缺点

    js继承方法 前因:ECMAScript不支持接口继承,只支持实现继承 一.原型链 概念:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针,让 ...

  2. JS继承 实现方式

    JS中继承方式的实现有多种方法,下面是比较推荐的方法,其它继承方式可做了解: function object(o) { function F() {} F.prototype = o; return ...

  3. js 继承的方式

    //定义object的继承方法 Object.extend = function(destination, source) { for(property in source) { destinatio ...

  4. js面向对象编程(第2版)——js继承多种方式

    附带书籍地址: js面向对象编程(第2版)

  5. JS继承的原理、方式和应用

    概要: 一.继承的原理 二.继承的几种方式 三.继承的应用场景 什么是继承? 继承:子类可以使用父类的所有功能,并且对这些功能进行扩展.继承的过程,就是从一般到特殊的过程.要了解JS继承必须首先要了解 ...

  6. JS类继承常用方式发展史

    JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...

  7. JS继承以及继承的几种实现方式总结

    传统面向对象语言:继承是类与类之间的关系. 而在js中由于es6之前没有类的概念,所以继承是对象与对象之间的关系. 在js中,继承就是指使一个对象有权去访问另一个对象的能力. 比如:比如对象a能够访问 ...

  8. js 继承的几种方式

    JS继承的实现方式: 既然要实现继承,那么首先我们得有一个父类,代码如下: function Animal(name) { // 属性 this.name = name || '小白'; // 实例方 ...

  9. js对象的几种创建方式和js实现继承的方式[转]

    一.js对象的创建方式 1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); ...

随机推荐

  1. [转] CVonline: Image Databases

    转自:CVonline by Robert Fisher 图像数据库 Index by Topic Action Databases Biological/Medical Face Databases ...

  2. Unix - 文件里构成一个空洞的分析

    lseek函数显示地为一个打开文件设置偏移量,文件偏移量能够大于文件的当前长度,在这样的情况下.对该文件的下一次写将加长该文件.并在文件里构成一个空洞,这一点是同意的. 位于文件里但没有写过的字节都被 ...

  3. 关于appcompat_v7的说明

    http://blog.csdn.net/crazykbc/article/details/21553699 问题描述: 使用eclipse创建一个Android项目时,发现project列表中会多创 ...

  4. 【bzoj1034】[ZJOI2008]泡泡堂BNB

    贪心 将双方的选手均按从强到弱排序,然后第一次扫描尽可能用当前剩下的选手中能赢对手当前最强选手中最弱的一个去赢得胜利,若无法做到,则暂时不考虑给对方最强的选手匹配对手.第二遍扫描使用同样策略去获取尽量 ...

  5. HTTP要点概述:六,HTTP报文

    一,HTTP报文: 用于HTTP交互的信息称为HTTP报文.请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器)的叫做响应报文.HTTP报文本身是由多行(用CR+LF换行)数据构成的字符串文本 ...

  6. CDN域名集合

    akamai-staging.net akamaized.net akamai.net cloudfront.net amazonaws.com azioncdn.net cachefly.net c ...

  7. mysql与mongoDB的特点和优劣

    首先分析下mysql与mongoDB的特点和优劣 从图中分析: 再来分析下应用场景: a.如果需要将mongodb作为后端db来代替mysql使用,即这里mysql与mongodb 属于平行级别,那么 ...

  8. CentOS 6.5下安装MySQL 5.6.21

    Linux中使用最广泛的数据库就是MySQL,使用在线yum的方式安装的版本落后MySQL网站好几个小版本,本节亲自测试安装新版的MySQL. 测试机器环境: VMware Workstation 1 ...

  9. 洛谷 P2312 & bzoj 3751 解方程 —— 取模

    题目:https://www.luogu.org/problemnew/show/P2312 https://www.lydsy.com/JudgeOnline/problem.php?id=3751 ...

  10. bzoj2157 旅游——LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 仍然是LCT模板题~ 不过有一些需要注意的地方,点和边的区分,0号点的 mx 和 mn ...