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中对象的继承的更多相关文章

  1. 关于JavaScript中对象的继承实现的学习总结

    一.原型链 JavaScript 中原型链是实现继承的主要方法.其主要的思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.实现原型链有一种基本模式,其代码如下. function Super ...

  2. 温习js中对象的继承

    温故而知新 XD 1. 关于原型和构造函数的几个知识要点: 使用new 操作符调用构造函数,会经历以下四个步骤: 1.1. 创建一个新对象: 1.2. 将构造函数的作用域赋给新对象(因此 this 就 ...

  3. javascript中对象函数继承的概念

    什么是函数对象?这个对象既是通常意义上的对象,又可以加上括号直接执行的函数. 产生函数对象的方式有两种:1.通过function关键字产生:var fn = function(){};2.实例化Fun ...

  4. Typescript中的类 Es5中的类和静态方法和继承(原型链继承、对象冒充继承、原型链+对象冒充组合继承)

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. Es5中的类和静态方法 继承

    Es5中的类和静态方法 继承(原型链继承.对象冒充继承.原型链+对象冒充组合继承) // es5里面的类 //1.最简单的类 // function Person(){ // this.name='张 ...

  6. 彻底理解什么是原型链,prototype和__proto__的区别以及es5中的继承

    再讲一遍好了( 参考https://blog.csdn.net/cc18868876837/article/details/81211729 https://blog.csdn.net/lc23742 ...

  7. ES6中的类继承和ES5中的继承模式详解

    1.ES5中的继承模式 我们先看ES5中的继承. 既然要实现继承,首先我们得要有一个父类. Animal.prototype.eat = function(food) { console.log(th ...

  8. 深入 JavaScript 中的对象以及继承原理

    ES6引入了一个很甜的语法糖就是 class, class 可以帮助开发者回归到 Java 时代的面向对象编程而不是 ES5 中被诟病的面向原型编程. 我也在工作的业务代码中大量的使用 class, ...

  9. ES5中的类与继承

    最近在重新复习TypeScript,看到类这块的时候自然会和ES5中的类写法进行对比加深印象. 发现ES5的类与继承一些细节还是挺多的,时间久了容易忘记,特此记录下. 首先是ES5的类定义,这没什么好 ...

  10. ES6中。类与继承的方法,以及与ES5中的方法的对比

    // 在ES5中,通常使用构造函数方法去实现类与继承 // 创建父类 function Father(name, age){ this.name = name; this.age = age; } F ...

随机推荐

  1. 为什么 Linux 需要虚拟内存(转载)

    为什么 Linux 需要虚拟内存 原文链接: https://draveness.me/whys-the-design-os-virtual-memory/ 操作系统中的 CPU 和主内存(Main ...

  2. P20_事件绑定

    事件绑定 什么是事件 事件是渲染层到逻辑层的通讯方式.通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务的处理. 小程序中常用的事件 事件对象的属性列表 当事件回调触发的时候,会收到一个事件对 ...

  3. 推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐

    1. 推荐算法的初步理解 如果说互联网的目标就是连接一切,那么推荐系统的作用就是建立更加有效率的连接,推荐系统可以更有效率的连接用户与内容和服务,节约了大量的时间和成本. 1.1 推荐系统主要解决问题 ...

  4. 如何让别人pip install自己写的库?

    一. 构建项目目录结构 结构如图所示: 文件介绍:LICENSE和README.md在git建仓库时选上,克隆下来就会有,license最好选择MIT的.sort.py文件里随便写个方法用于直接调用: ...

  5. Java中的源码,反码和补码

    一.在Java中所有数据都是以补码的形式表示的,原码即数字的二进制表示加符号位,反码即将原码按位取反,补码简单来说即反码加1 二.Java中数据的表示方式 1.正数:正数的原码.补码.反码都相同,正数 ...

  6. script和template里可选链运算符?.报错Syntax Error: Unexpected token (64:2)

    前情:babel-core@6.2.3,  vue@2.7.14 试过的方法:1.安装@babel/plugin-proposal-optional-chaining,设置.babelrc文件如下,报 ...

  7. C语言学习--动态内存分配(未完待续)

    内存分配的类型: 在C/C++中内存分为5个区,分别为栈区.堆区.全局/静态存储区.常量存储区.代码区. 静态内存分配:编译时分配.包括:全局.静态全局.静态局部三种变量. 动态内存分配:运行时分配. ...

  8. 爬虫下载rockchip的规格书

    #file-name: pdf_download.py import os import requests from bs4 import BeautifulSoup def download_fil ...

  9. DOM06~

    Window 对象 BOM (浏览器对象模型) 定时器-延时函数 js 执行机制 location 对象 navigator 对象 history 对象 BOM BOM (Browser Object ...

  10. 多个mysql版本并行运行

    mysql管理工具:mysql服务器需要客户端连接到服务器上进行管理.客户端有可能是个软件,也有可能是个java程序 安装mysql启用服务起别名+登录账号①mysqld install -m8;ne ...