javascript --- 继承小结
回顾之前学到的知识,大体上可以分为两类:
1. 基于构造器工作的模式。
2. 基于对象的工作模式。
3. 是否使用原型
4. 是否执行属性拷贝。
5. 两者都有(执行原型属性拷贝)
下面我们把之前的知识都来回顾一下:
1.原型链法(仿传统):
child.prototype = new Parent();
所属模式:基于构造函数的模式,使用原型链模式。
技术注解:默认继承机制,我们可以将方法与属性集中可重用的部分迁移到原型链中,而将不可重用的那部分属性与方法设置成自身的属性。
2.仅从原型继承法:
Child.prototype = Parent.prototype
所属模式:基于构造函数的工作模式,原型拷贝模式(不存在原型链,所有对象共享一个原型)。
技术注解:由于该模式在构建继承关系上不需要新建对象实例,所以在效率上会有较好的表现。
原型链上的查询也比较快,因为这里根本不存在链。
缺点在于,对子对象的修改会影响父对象,因为子对象只是父对象的一个引用。
3.临时构造器法:
function extend(Child, parent){
var F = fucntion(){};
F.prototype = Parent.prtotype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype;
}
所属模式:基于构造函数的工作模式,使用原型链模式。
技术注解:此模式不同于1号模式,她只继承父对象的原型属性,而对父对象的自身属性(也就是被添加到父级构造函数中this的属性)则不予继承。
另外,此模式还提供了访问父对象的方式。(即通过usber属性)。
4.原型属拷贝法:
function extend2(Child, Parent){
var p = Parent.prototype;
var c = Child.prototype;
for(var i in p){
c[i] = p[i];
}
c.uber = p;
}
所属模式:基于构造器工作模式,属性拷贝模式,使用原型模式。
技术注解:将父对象原型中的内容全部转化为子对象的原型属性。
无需为继承单独创建对象实例。
原型链本身也更短。
5.全属性拷贝法:
function extendCopy(p){
var c = {};
for(var i in p){
c[i] = p[i];
}
c.uber = p;
return c;
}
所属模式:基于对象的工作模式,属性拷贝模式。
技术注解:非常简单,没有使用原型属性。
6.深拷贝法:
function deepCopy(Parent, Child){
Child = Child || {};
for(var i in Parent){
if(Parent.hasOwnProprty(i)){
if(typeof Parent[i] === 'Object'){
Child[i] = Array.isArray(p[i]) ? [] : {};
deepcopy(Parent[i], Child[i]);
}else{
Child[i] = Parent[i]
}
}
}
return Child;
}
所属模式:基于对象的工作模式,属性拷贝模式。
技术注解:与5相同,但所有对象都是值传递。
7.原型继承法:
function object(o){
function F(){};
F.prototype = o;
return new F();
}
所属模式:基于对象工作模式,基于原型链模式。
技术注解:丢开仿类机制,直接在对象之间构建继承关系。
发挥原型固有优势。
8.扩展与增强模式:
function objectPlus(o, stuff){
var n;
function(){};
F.prototype = o;
n = new F();
n.uber = o;
for(var i in stuff){
n[i] = stuff[i]
}
return n;
}
所属模式:基于对象工作模式,使用原型链模式,属性拷贝模式。
技术注解:该方法实际上是原型继承与原型拷贝的混合应用,她通过一个函数一次性的完成对象的继承与扩展。
9.多重继承法:
function multi(){
var n = {}, stuff, j = 0;
len = arguments.length;
for(j=0;j<len;j++){
stuff = argument[j];
for(var i in stuff){
n[i] = stuff[i];
}
}
return n;
}
所属模式:基于对象工作模式,属性拷贝模式。
技术注解:一种混合插入式继承实现。
她会按照父对象的继承顺序依次对她们进行属性全拷贝。
10.寄生继承法:
function parasite(victim){
var that = object(victim);
that.more = 1;
return that;
}
所属模式:基于对象工作模式,使用原型链模式。
技术注解:该方法通过一个类似于构造器的函数来创建对象。
该函数会执行相应的对象拷贝,并对其进行扩展,然后返回该拷贝。
11.构造器借用法:
function Child{
Parent.apply(this, arguments);
}
所属模式:基于构造器的工作模式。
技术注解:该方法只能继承父对象的自身属性(也就是构造函数里的this.属性、方法)。
可以与方法一相结合。
她便于我们的子对象继承某个对象的具体属性时,该方式是最简单的方式。
12.构造器借用与属性拷贝法:
function Child(){
Parent.apply(this, argument);
}
extend2(Child, Parent);
所属模式:基于构造器的工作模式,使用原型链模式,属性拷贝模式。
技术注解:她允许我们在不重复使用调用对象构造器的情况下同时继承自身属性和原型属性。
额,持续更新了这么多天,大概也就这么多了,能力有限,多多包涵!
下面,我们在持续探讨,我们的javascript宿主环境,也就是浏览器环境(Bom),大家换一种思路来看待一下的文章吧!!!
javascript --- 继承小结的更多相关文章
- Js继承小结
Js继承小结 一直以来,对Js的继承有所认识,但是认识不全面,没什么深刻印象.于是,经常性的浪费很多时间重新看博文学习继承,今天工作不是特别忙,有幸看到了http://www.slideshare.n ...
- javascript继承的三种模式
javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...
- javascript继承机制的设计思想(ryf)
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
- 【读书笔记】javascript 继承
在JavaScript中继承不像C#那么直接,C#中子类继承父类之后马上获得了父类的属性和方法,但JavaScript需要分步进行. 让Brid 继承 Animal,并扩展自己fly的方法. func ...
- 图解JavaScript 继承
JavaScript作为一个面向对象语言,可以实现继承是必不可少的,但是由于本身并没有类的概念(不知道这样说是否严谨,但在js中一切都类皆是对象模拟)所以在JavaScript中的继承也区别于其他的面 ...
- JavaScript强化教程——Cocos2d-JS中JavaScript继承
javaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来 ...
- [原创]JavaScript继承详解
原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...
- javascript继承(六)—实现多继承
在上一篇javascript继承—prototype最优两种继承(空函数和循环拷贝)(3) ,介绍了js较完美继承的两种实现方案,那么下面来探讨一下js里是否有多继承,如何实现多继承.在这里可以看看j ...
- javascript继承(五)—prototype最优两种继承(空函数和循环拷贝)
一.利用空函数实现继承 参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...
随机推荐
- ACM-ICPC 2017 Asia Urumqi G. The Mountain
All as we know, a mountain is a large landform that stretches above the surrounding land in a limite ...
- (转)减少oracle sql回表次数 提高SQL查询性能
要写出高效的SQL,那么必须必须得清楚SQL执行路径,介绍如何提高SQL性能的文章很多,这里不再赘述,本人来谈谈如何从 减少SQL回表次数 来提高查询性能,因为回表将导致扫描更多的数据块. 我们大家都 ...
- 安装go 1.5 & 部署
https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz tar -C /usr/local -xzf go1.5.linux-am ...
- [POJ 1008] Maya Calendar C++解题
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62297 Accepted: 192 ...
- 一张图展示:用两个栈来实现一个队列,完成队列的Push和Pop操作
一 基本思路 将s1作为存储空间,以s2作为临时缓冲区. 入队时,将元素压入s1. 出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒 ...
- JS使用onerror进行默认图像显示,可代替alt
JS代码 //图像加载出错时的处理 function errorImg(img) { img.src = "默认图片.jpg"; img.onerror = null; } HTM ...
- Leetcode 416.分割等和子集
分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [ ...
- [uiautomator篇][exist 存在,但click错误]
uiautomator定位页面元素是,定位存在的;但是click的时候,发现点的位置不对,(不知道是android系统的问题还是uiautomator的问题,初步怀疑是系统的问题)
- PHP协程是通过生成器实现的,这里测试了PHP生成器的一些特性
学习PHP的生成器,测试了一些特性.代码如下: function gen() { $name = (yield 'hello'); $nickname = (yield 'world'); yield ...
- Codeforces 899D Shovel Sale
题目大意 给定正整数 $n$($2\le n\le 10^9$). 考虑无序整数对 $(x, y)$($1\le x,y\le n, x\ne y$). 求满足 「$x+y$ 结尾连续的 9 最多」的 ...