ES5中对象的继承
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();
}
ES5中对象的继承的更多相关文章
- 关于JavaScript中对象的继承实现的学习总结
一.原型链 JavaScript 中原型链是实现继承的主要方法.其主要的思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.实现原型链有一种基本模式,其代码如下. function Super ...
- 温习js中对象的继承
温故而知新 XD 1. 关于原型和构造函数的几个知识要点: 使用new 操作符调用构造函数,会经历以下四个步骤: 1.1. 创建一个新对象: 1.2. 将构造函数的作用域赋给新对象(因此 this 就 ...
- javascript中对象函数继承的概念
什么是函数对象?这个对象既是通常意义上的对象,又可以加上括号直接执行的函数. 产生函数对象的方式有两种:1.通过function关键字产生:var fn = function(){};2.实例化Fun ...
- Typescript中的类 Es5中的类和静态方法和继承(原型链继承、对象冒充继承、原型链+对象冒充组合继承)
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- Es5中的类和静态方法 继承
Es5中的类和静态方法 继承(原型链继承.对象冒充继承.原型链+对象冒充组合继承) // es5里面的类 //1.最简单的类 // function Person(){ // this.name='张 ...
- 彻底理解什么是原型链,prototype和__proto__的区别以及es5中的继承
再讲一遍好了( 参考https://blog.csdn.net/cc18868876837/article/details/81211729 https://blog.csdn.net/lc23742 ...
- ES6中的类继承和ES5中的继承模式详解
1.ES5中的继承模式 我们先看ES5中的继承. 既然要实现继承,首先我们得要有一个父类. Animal.prototype.eat = function(food) { console.log(th ...
- 深入 JavaScript 中的对象以及继承原理
ES6引入了一个很甜的语法糖就是 class, class 可以帮助开发者回归到 Java 时代的面向对象编程而不是 ES5 中被诟病的面向原型编程. 我也在工作的业务代码中大量的使用 class, ...
- ES5中的类与继承
最近在重新复习TypeScript,看到类这块的时候自然会和ES5中的类写法进行对比加深印象. 发现ES5的类与继承一些细节还是挺多的,时间久了容易忘记,特此记录下. 首先是ES5的类定义,这没什么好 ...
- ES6中。类与继承的方法,以及与ES5中的方法的对比
// 在ES5中,通常使用构造函数方法去实现类与继承 // 创建父类 function Father(name, age){ this.name = name; this.age = age; } F ...
随机推荐
- drf-day4——序列化类常用字段和字段参数、序列化类source用法、序列化类定制字段返回内容的两种方式、序列化类的多表关联反序列化保存、反序列化字段校验、ModelSerializer的使用
目录 一.序列化类常用字段和字段参数(了解) 1.1 常用字段类 1.2 常用字段参数 选项参数: 通用参数: 重点 二.序列化高级用法之source(了解) 2.1 序列化定制字段名字 三.序列化高 ...
- Selenium中的option用法实例
Selenium中的option用法实例 在上一篇文章Selenium中免登录的实现方法一option中我们用到了option,而option的用法是很多的,本文举几个例子 关于无头浏览器,也属于op ...
- python学习day04
1.基本数据类型之布尔值bool 1.用来判断事物的对错,是否可行,用于流程控制中 2.只有两种状态: True:对的.真的.可行的 False:错的.假的.不可行的 3.python中所有的数据都自 ...
- 计算机网络基础09 TCP/IP
https://www.jianshu.com/p/066d99da7cbd 1 概念 TCP/IP[TCP(传输控制协议)和IP(网际协议)]提供点对点的链接机制,将数据应该如何封装.定址.传输.路 ...
- RocketMQ - 生产者原理
https://rocketmq.apache.org/ Apache RocketMQ是一款开源的.分布式的消息投递与流数据平台.出生自阿里巴巴,在阿里巴巴内部经历了3个版本后,作为Apache 顶 ...
- P22_条件渲染
条件渲染 wx:if 在小程序中,使用 wx:if="{{condition}}" 来判断是否需要渲染该代码块: 也可以用 wx:elif 和 wx:else 来添加 else 判 ...
- Ansible 快速入门到放弃
Ansible 快速入门到放弃 最是人间留不住,朱颜辞镜花辞树. 1-Ansible 简介 Ansible是一个配置管理和配置工具,它使用SSH 连接到服务器并运行配置好的任务,服务器上只需要开启ss ...
- 利用canvas+js完成滑块验证码中canvas部分思路
1. 最终效果 2.滑块验证码思路 大概思路:设置两个画布,一个为显示图像的canvas画布,一个为拼图的block画布,block画布拼图内容从图像画布中的一部分裁剪得到(使用clip()),通过绑 ...
- Spark系列 - (3) Spark SQL
3. Spark SQL 3.1 Hive.Shark和Sparksql Hive:Hadoop刚开始出来的时候,使用的是hadoop自带的分布式计算系统 MapReduce,但是MapReduce的 ...
- 9.【go-kit教程】go-kit集成Prometheus
在 Go kit 中集成 Prometheus 进行 API 监控可以帮助开发人员更好地了解系统的性能和行为,提高系统的可观察性和可靠性.下面是一个简单的示例,演示如何在 Go kit 中集成 Pro ...