1 js原型链是一个绕不开的话题。直接上说吧。

/**
* 1. js里的原型链是怎么样的? 带class 和不带class的原型链的不同。
*/ const util = require('util');
function A() {
console.info("I am A ");
} function B() {
console.info("I am B ");
} function C() {
console.info("I am C ");
} util.inherits(B, A);
util.inherits(C, B);
class CA {
constructor(){
console.info("i am CA");
} doCA(){
console.info(" doCA ");
}
} class CB extends CA{
constructor(){
super();
console.info("i am CB");
} doCB(){
console.info(" do CB ");
}
} class CC extends CB {
constructor(){
super();
console.info("i am CC");
} doCC(){
console.info(" i am doCC");
}
} //原型链继承如下:
var c = new C();
console.info( c.__proto__ === C.prototype);
console.info(c.__proto__.__proto__ === B.prototype);
console.info(c.__proto__.__proto__.__proto__ === A.prototype);
console.info(c.__proto__.__proto__.__proto__.__proto__ === Object.prototype);
console.info(c.__proto__.__proto__.__proto__.__proto__.__proto__ === null); //class
var cc = new CC();
console.info(cc.__proto__ === CC.prototype);
console.info(cc.__proto__.__proto__ === CB.prototype);
console.info(cc.__proto__.__proto__.__proto__ === CA.prototype);
console.info(cc.__proto__.__proto__.__proto__.__proto__ === Object.prototype);
console.info(cc.__proto__.__proto__.__proto__.__proto__.__proto__ === null); //下面是类的继承关系。class和非class是不同的
console.info("类继承关系");
console.info(C.prototype.constructor === C);//C的原型的构造 = 本身
console.info(C.__proto__ === Function.prototype);//所有的类的__proto__指向Function的原型,即构造主的原型。
console.info(Function.__proto__ === Function.prototype);// console.info("带class的类继承关系");
console.info(CC.__proto__ === CB);//带class 的CC的__proto__指向,cb, 最终最想 Function的原型。
console.info(CC.__proto__.__proto__ === CA);
console.info(CA.__proto__ === Function.prototype);

原型链要记住一下几点:

1. 每个东西都有 __proto__

2. 类的prototype = 类的原型。 类的原型的 construct = 类。

3. 小c的__proto__ = C的原型,C的原型的__proto__= B的原型, B的原型的__proto__ = A的原型 , A的原型的 __proto__ = Object的原型,Object的原型的__proto__ = null;这就是原型链,很简单吧。

4. 用class 继承时, CC的__proto__ = CB, CB的__proto__ = CA, CA的__proto__ = Function的原型。

用util.inherits 实现继承时, C,B,A, Function的__proto__ 都等于 Function的原型。

只要把上面都记住,多练习,就可以很好的掌握原型链。

以上如果还没有看懂的话,可以参考:https://blog.csdn.net/m0_37589327/article/details/78655038

02 js原型链的更多相关文章

  1. JS原型链

    JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承. 首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__ ...

  2. 深入分析JS原型链以及为什么不能在原型链上使用对象

    在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...

  3. js原型链与继承(初体验)

    js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...

  4. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

  5. 深入理解JS原型链与继承

    我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...

  6. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

  7. 一张图看懂 JS 原型链

    JS 原型链,画了张图,终于理清楚各种关系有木有 写在最后: __proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!! function Person() { } 是函 ...

  8. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  9. JS原型链与继承别再被问倒了

    原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...

随机推荐

  1. Git常用命令速查表,新手必备版本控制

    Git 跟 SVN 一样,都是用于管理代码的版本控制工具.无论在项目中,我们负责哪一块,只要需要编写代码,就必须熟悉Git(依公司要求而定). 当然,用的越熟练,处理的项目越顺利,离出任CTO.迎娶白 ...

  2. DDD不是架构设计方法

    DDD不是架构设计方法 一文读懂DDD 2019-05-28 19:18 by 春哥大魔王, 413 阅读, 3 评论, 收藏, 编辑 何为DDD DDD不是架构设计方法,不能把每个设计细节具象化,D ...

  3. UWP 保存音乐或视频缩略图图片到本地

    开发项目时,有时需要将本地媒体文件的缩略图保存到本地,下面是源码. 需要打开Package.appxmanifest 功能 图片库 访问权限. <Page x:Class="SaveB ...

  4. fzu1704(高斯消元法解异或方程组+高精度输出)

    题目链接:https://vjudge.net/problem/FZU-1704 题意:经典开关问题,求使得灯全0的方案数. 思路:题目保证至少存在一种方案,即方程组一定有解,那么套上高斯消元法的板子 ...

  5. GitHub项目管理维护实用教程

    GitHub项目维护教程   1)注册GitHub账户并登陆: 2)在Windows cmd(或Ubuntu中的terminal)中cd到自己的工作目录,将仓库clone下来: 命令: git clo ...

  6. SQL SERVER导入EXCEL文件:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序

    1.安装相关组件  2.程序生成属性32位改为64位

  7. 2019年08月21日 服务部署笔记 请求打不到域名后某个pod上

    背景: 一个小项目http+https的小项目, 需要配置域名, 因http 和 https服务共存, 所以决定域名后面挂两个不同的LVS, 80端口一个, 443端口一个. 服务框架: nginx服 ...

  8. 剑指offer32:把数组排成最小的数

    1 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 2 思路 ...

  9. 移动端APP测试概要

    APP测试点总结(全面) 一.功能性测试: ——根据产品需求文档编写测试用例. ——软件设计文档编写用例. 注意:就是根据产品需求文档编写测试用例而进行测试. 二.兼容性测试: ——android版本 ...

  10. Delphi cxpagecontrol融合窗体

    功能说明: 一.在需要融合的每个窗体加一句 initialization RegisterClasses([TFrmDataDict]); //类名 二.cxpagecontrol融合窗体,在调用时 ...