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(); ...
随机推荐
- jeasyUI treegrid 的 reload 和 getChanges
看上去,treegrid继承自datagrid,因此,datagrid有的,treegrid也会有. 比如说,getChanges,翻看那些网络教程,绝大多数都没提treegrid有这个东东.但是,t ...
- iOS开发——swift——swift与OC之间不得不知道的21点
swift与OC之间不得不知道的21点 自6月的WWDC大会上由苹果的大神Chris Lattner向我们首次展示swift至今已经大半年时间了,虽然绝大部分软件公司代码里还都见不到一丁点swif ...
- 第二步:将LAD结果的属性值二(多)值化,投入计算模型
一文详解LDA主题模型 - 达观数据 - SegmentFault 思否 https://segmentfault.com/a/1190000012215533 SELECT COUNT(1) FRO ...
- 有意思的RTL函数RegisterClass(在持久化中,你生成的一个新类的对象,系统并不知道他是如何来的,因此需要你注册)good
例子1:Delphi中使用纯正的面向对象方法(这个例子最直接) Delphi的VCL技术使很多程序员能够非常快速的入门:程序员门只要简单的拖动再加上少量的几个Pascal语句,呵呵,一个可以运行得非常 ...
- [RK3288][Android6.0] 系统按键驱动流程分析【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/77894406 Rockchip的按键驱动位于 kernel/drivers/input/ke ...
- POJ 2080:Calendar
Calendar Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12546 Accepted: 4547 Descrip ...
- 第十二周 Leetcode 354. Russian Doll Envelopes(HARD) LIS问题
Leetcode354 暴力的方法是显而易见的 O(n^2)构造一个DAG找最长链即可. 也有办法优化到O(nlogn) 注意 信封的方向是不能转换的. 对第一维从小到大排序,第一维相同第二维从大到小 ...
- query或者JavaScript实现在textarea光标处插入文本
1.Jquery函数实现: $(function() { /* 在textarea处插入文本--Start */ (function($) { $.fn.extend({ insertContent ...
- C++中正确使用PRId64 (转载)
转自:http://blog.csdn.net/win_lin/article/details/7912693 例子参考高性能流媒体服务器SRS:https://github.com/winlinvi ...
- E20171225-hm
abstract adj. 抽象的,理论上的; 难解的; 抽象派的; 茫然的;