js继承的方式
深入理解继承的实现方式不仅仅有利于自己去造轮子,封装插件,更有利于我们去阅读一些框架的源码,
以下记录几种常见的继承方式
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继承的方式的更多相关文章
- js继承的方式及其优缺点
js继承方法 前因:ECMAScript不支持接口继承,只支持实现继承 一.原型链 概念:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针,让 ...
- JS继承 实现方式
JS中继承方式的实现有多种方法,下面是比较推荐的方法,其它继承方式可做了解: function object(o) { function F() {} F.prototype = o; return ...
- js 继承的方式
//定义object的继承方法 Object.extend = function(destination, source) { for(property in source) { destinatio ...
- js面向对象编程(第2版)——js继承多种方式
附带书籍地址: js面向对象编程(第2版)
- JS继承的原理、方式和应用
概要: 一.继承的原理 二.继承的几种方式 三.继承的应用场景 什么是继承? 继承:子类可以使用父类的所有功能,并且对这些功能进行扩展.继承的过程,就是从一般到特殊的过程.要了解JS继承必须首先要了解 ...
- JS类继承常用方式发展史
JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...
- JS继承以及继承的几种实现方式总结
传统面向对象语言:继承是类与类之间的关系. 而在js中由于es6之前没有类的概念,所以继承是对象与对象之间的关系. 在js中,继承就是指使一个对象有权去访问另一个对象的能力. 比如:比如对象a能够访问 ...
- js 继承的几种方式
JS继承的实现方式: 既然要实现继承,那么首先我们得有一个父类,代码如下: function Animal(name) { // 属性 this.name = name || '小白'; // 实例方 ...
- js对象的几种创建方式和js实现继承的方式[转]
一.js对象的创建方式 1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); ...
随机推荐
- TensorFlow的安装与CNN测试
0.说明 在Google开源该框架之后便使用真实K40m卡测试,由于生产环境是CentOS6.6的操作系统,但是该框架需要在Python2.7环境下执行,CentOS6.6下折腾了一天没搞定,后来换成 ...
- ubuntu双网卡绑定配置
1,安装bonding需要的软件 sudo apt-get install ifenslave 2,在/etc/modules中加入: bonding mode= miimon= 3,在/etc/ne ...
- hdu1115 Lifting the Stone(几何,求多边形重心模板题)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=1115">http://acm.hdu.edu.cn/showproblem.php ...
- 2016/2/19 css样式表 Cascading Style Sheet 叠层样式表 美化HTML网页
一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控制精确,但是可重用性差,冗余较多. 例:<p style="font-size:14px;">内联 ...
- Codeforces Beta Round #96 (Div. 1) C. Logo Turtle DP
C. Logo Turtle A lot of people associate Logo programming language with turtle graphics. In this c ...
- YTU 2635: P4 游戏中的Human角色
2635: P4 游戏中的Human角色 时间限制: 1 Sec 内存限制: 128 MB 提交: 524 解决: 328 题目描述 在一个平面打斗游戏中,任何的角色(Role)都有血量(bloo ...
- [Codeforces 1037D] Valid BFS?
[题目链接] http://codeforces.com/problemset/problem/1037/D [算法] 首先求出每个点的父节点 , 每棵子树的大小 然后判断BFS序是否合法即可 时间复 ...
- 51Nod 1486 大大走格子 —— 容斥
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 对于每个点,求出从起点到它,不经过其他障碍点的方案数: 求一 ...
- Avito Code Challenge 2018 A~E
A. Antipalindrome 还以为是什么神dp结果就是分情况讨论啊 原串是一串一样的字符的话输出0,是回文串的话输出n-1,否则直接输出原串长度 #include<iostream> ...
- mysql——免安装配置
1.下载 (1)下载地址:https://dev.mysql.com/downloads/mysql/ (2)选择下载 2.配置环境变量 (1)解压目录:D:\mysql-8.0.16-winx64 ...