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(); ...
随机推荐
- Android自己定义组件系列【5】——进阶实践(2)
上一篇<Android自己定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这 ...
- SEO 搜索引擎优化培训01
百度搜索风云榜:http://top.baidu.com/boards 页面上的因素:对搜索引擎而言
- [DevExpress]GridControl分页的实现
加入两个组件:BindingNavigator和BindingSource 代码: using System; using System.Collections.Generic; using Syst ...
- 【bzoj1507】[NOI2003]Editor
第二次写rope了 rope大法好!!! #include<algorithm> #include<iostream> #include<ext/rope> #in ...
- 局部优化与整体效果 新增时间>节省时间 权衡利弊
原代码 from selenium import webdriverimport requests,timeurl_l=[]with open('DISTINCT_url.txt', 'r', enc ...
- Bootstrap 模态窗口源码分析
前言: bootstrap的 js插件的源码写的非常好,也算是编写jquery插件的模范写法,本来还想大篇详细的分析一下呢,唉,没时间啊,很早之前看过的源码了,现在贴在了博客上, 300来行的代码,其 ...
- ios18---自定义控件3改进
控制器: // XMGViewController.h #import <UIKit/UIKit.h> @interface XMGViewController : UIViewContr ...
- UIColor与十六进制字符串互转
UIColor转十六进制字符串 方法一:经过测试发现部分颜色会转化为#fffff(五个f),转化残缺导致最后颜色无法还原,不推荐使用. // UIColor转#ffffff格式的字符串 + (NSSt ...
- 获取view宽高
在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽和高,看似没有问题,其实他们去得值是0,并不是你想要的结果? 这是为什么呢? 在调用onc ...
- [POI2011]LIZ-Lollipop
https://www.zybuluo.com/ysner/note/1303462 题面 给一个只有\(1\)和\(2\)的序列,每次询问有没有一个子串的和为\(x\). \(n\leq10^6\) ...