1.继承的类型

  在oo语言中,继承有两种方式,借口继承和实现继承,因为ECMAScript不支持方法签名,所以ECMAScript只支持实现继承。

2.原型链继承的实现

  2.1.原型链

    ES5继承可以使用原型链,原型链的形态可以理解为让一个构造函数的原型成为另一个构造函数的实例,这样会重写这个原型对象。因为有constructor,prototype的存在,使构造函数和原型有了双向确定的能力和范围延展的能力,层层延伸便构成了原型链。

function SuperType(){
this.prototype = true;
}
SuperType.prototype.getSuperValue(){
return this.prototype;
}
function SubType(){
this.subprototype = false;
}
Subtype.prototype = new SuperType();//实现继承,重写原型对象,包括constructor,现在constructor指向SuperType
var instance = new Subtype();
alert(instance.getSuperValue()); //true

当访问一个实例属性时,先搜索实例,再搜索原型对象,如果还没有找到,再向原型链继续向上搜索,在原型链的最顶端,君临着Object,所有函数的默认原型都是Object的实例。

  2.2.实例与原型的关系

     我们可以使用instanceof操作符或者isPrototypeOf()方法来判断原型链中是否出现过某构造函数。(判断构造函数是否在原型链上)

alert(instance instanceof Object) //true
alert(instance instanceof Supertype)//true
alert(Object.prototype.isPrototypeOf(instance));//true
alert(SuperType.prototype.isPrototypeOf(instance));//true

与使用原型模式创建对象时类似,我们使用原型链继承时,原型里面的所有属性都会被实例所共享,在创造原型链时,一个对象的原型会变成另一个对象的实例,所以这个实例的属性便会被共享。

在操作继承过来的属性时,相当于在操作原型里面的内容。这就像一个没有上锁的箱子,任何人都可以打开。并且在使用原型链继承时,我们不能向超类型的构造函数传递参数。

3.构造函数继承

  3.1.借用构造函数

因为原型链继承有以上缺点,我们用其他方式来继承比较好,构造函数继承利用函数的作用域克服了原型链继承中共享的问题,但是因为方法都是写在构造函数里的,因此不能实现方法复用。

function SuperType(){
this.colors = ["red","blue","green"];
}
function SubType(){
SuperType.call(this); //在SubType作用域中运行SuperType的构造函数,实现了继承
}
var instance1 = new SubType();
instance1.colors.push("black");
alert(instance.colors);//"red, blue,green,black"
var instance2 = new SubType();
alert(instance2.colors);//"red, blue,green"

4.组合继承

  在对象的创建中也出现过,我们可以结合构造函数和原型链来实现继承,构造函数实现对属性的继承,原型链实现对方法的继承,这样可以实现扬长避短的功效。

function SuperType(words){
var colors = ["red","blue","green"];
this.words = words
}
SuperType.prototype.saySometing = function(){
alert(this.words);
}
function Subtype(){
SuperType.call(this);
}
var instance1 = new SubType("hello");
var instance2 = new SubType("what?");
instance1.colors.push("black");
alert(instance1.colors);//"red,blue,green,black"
alert(instance2.colors);//"red,blue,green"
alert(instance1.saySomething());//"hello"
alert(instance2.saySomething());//"what?"

5.原型式继承

  这种继承方式包含了原型链继承,用一个函数给出一个定了父类型的子类型,这个父类型由函数的参数表示。

function object(){
function F();
F.prototype = o;
return new F();
}

最新文章

  1. Halcon学习之tuple
  2. 区间DP lightoj 1422
  3. python_way ,day26 django_admin 自定义
  4. Python for循环内部实现的一个sample
  5. php生成图片
  6. mybatis模板
  7. box-sizing的学习和认识
  8. python - 沙盒环境 - virtualenv - 简明使用录
  9. less-1
  10. NYOJ 10 skiing动态规划心得
  11. 第28讲 UI组件之 ListView和ArrayAdapter
  12. 洛谷 P3383 【模板】线性筛素数
  13. 一、Spring Cloud介绍
  14. linux学习:归档,备份及进程相关命令用法整理
  15. Java第五次实验
  16. 【手记】解决涉及office的程序报“Unable to cast COM object of type System._ComObject...”的问题
  17. Jackcard类似度和余弦类似度(向量空间模型)的java实现
  18. 多项式函数插值:多项式形式函数求值的Horner嵌套算法
  19. UVALive 3135--Argus+自己定义优先队列的优先规则
  20. pthread线程私有数据

热门文章

  1. 12月16日内容总结——图书管理系统、聚合与分组查询、F与Q查询
  2. drf-序列化器、反序列化、反序列化校验
  3. 重启系统(等级考试4级 2021-03 T4)
  4. WSL 2 内配置Fcitx自启动
  5. spring cloud alibaba - Nacos 下载安装
  6. WAVE音频文件格式及其64位扩展格式的简要介绍
  7. 如何使用 ArrayPool
  8. P4238 【模板】多项式乘法逆
  9. JZOJ 4308.长寿花
  10. JZOJ 2020.07.27【NOIP提高组】模拟