JS 之继承
ECMAScript继承是通过原型链来继承的。基本思想是利用原型来让一个引用类型继承另一个引用类型的属性和方法,使原型变为另一个对象的实例。通过原型链实现继承时,不能使用对象字面量创建原型方法,避免重写原型链。
原型链继承的问题
1.原型中的引用类型的值都会被共享。
2.在创建子类型的实例时,无法在不影响所有对象实例的情况下,向超类型的构造函数传递参数。意思是如果向超类型的构造函数传递参数,则会影响到所有该对象的实例。
借用构造函数
为解决上面的问题,可以使用借用构造函数的概念,思想是在子类型构造函数的内部调用超类型构造函数。使用apply或call方法。这种方式的缺点是无法实现方法的复用。
组合继承
比较有效的方式是结合原型链继承与构造函数继承。思路是使用原型链继承原型的属性和方法,借用构造函数(apply或call方法)继承实例属性。这样,即通过原型上定义方法来实现函数复用,又能保证每个实例都有自己独立的属性。
原型式继承
eg:
function object(o){
function F(){};
F.prototype = o;
return new F();
}
寄生式继承
eg:
function aobject(o){
var clone = object(o); //创建一个新对象,这个对象的原型属性是o
clone.method = function(){ //给对象添加方法来增强对象
alert('aa');
}
return clone; //返回这个新对象
}
寄生组合式继承
思路是借用构造函数来继承属性,通过原型链混成方式来继承方法,也就是子类型的原型继承超类型的原型方法和属性。
eg:
function inheritPrototype(subtype,supertype){
var prototype = object(super.prototype); // 创建超类型原型的一个副本
prototype.constructor = subtype; //给副本添加construtor属性,弥补因重写原型而失去的默认的constructor属性
subtype.prototype = prototype; //将新创建的副本赋值给子类型的原型
}
使用组合式继承是最有效的方法。
总结自:《javascript 高级程序设计》
JS 之继承的更多相关文章
- JS对象继承篇
JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...
- js实现继承的5种方式 (笔记)
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- js实现继承的方式总结
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- 【09-23】js原型继承学习笔记
js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...
- js实现继承的两种方式
这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...
- js实现继承
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
- 浅谈JS的继承
JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...
- JS类继承常用方式发展史
JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...
- js实现继承的5种方式
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
- JS原型继承与类的继承
我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
随机推荐
- object-c中的类目,延展,协议
协议 协议只有方法的声明(类似于其他编程语言的接口) 协议相当于大家都所遵循的 关键字 @protocol 协议名 <所遵循的协议> 默认NSObject @end @pr ...
- iOS开发中常用方法调用顺序
- 安装MySQL,在./configure时出现错误:error: No curses/termcap library found的解决办法
是./configure出了问题,于是回头查看,果然发现问题: 最后几行出了错.完整错误信息如下: checking for tgetent in -lncurses... no checking f ...
- Effective Java 70 Document thread safety
Principle The presence of the synchronized modifier in a method declaration is an implementation det ...
- Autocomplete:属性介绍、firefox中文支持问题
如有问题,请前往 http://www.cnblogs.com/dreamowneryong/p/4953911.html 原文评论交流 一,属性介绍 * minChars (Number) 在触发a ...
- olcal数据库经典SQL语句大全
基于olacle自带的表 第一篇 -----1.列出至少有一个员工的所有部门. oracle 一些经典sql第一篇 --------1.列出至少有一个员工的所有部门.--------- SQL> ...
- cordova 环境搭建
安装环境前题是nodejs已安装,android环境搭建完成,android环境没有通过http://www.androiddevtools.cn/安装,安装使用 淘宝 NPM 镜像 方式 1.运行c ...
- Oracle VirtualBox 使用桥接网络完成主机和虚拟机之间的双向通讯
最近刚换了新的笔记本电脑,终于使用上intel i7处理器,可以使用硬件虚拟化技术安装系统.配置如下: 主机 ThinkPad P50s OS Window 10 虚拟机软件 Orac ...
- popupWindow弹出来后,背景变暗,半透明
/** * 点击评分,如果评分后,显示的弹出框 */ private void showMakeGradeMarkedWindow() { View view = LayoutInflater.fro ...
- JavaScript的函数重载
java语言中函数的重载和重写可谓是很重要的概念,所以在写js的时候时不时的会想到这种用法,重写先不说,这里只说重载.. <script language="JavaScript&qu ...