0

0

js中的作用域链和原型链以及原型继承

韦小宝

韦小宝

发布时间:2018-03-07 10:22:36

|

3644人浏览过

|

来源于php中文网

原创

在js 中, 有两条链子,作用域链和原型链,作用域链相对容易理解点,而原型链就相对复杂了,我们今天就来详细的讲讲这复杂的原型链以及原型继承。我们直接进入正题吧!

作用域链

作用域链相对容易理解,两点

    1、函数限定变量作用域,就是说,在JavaScript中,在函数里面定义的变量,可以在函数里面被访问,但是在函数外无法访问

    2、在JavaScript中使用变量,JavaScript解释器首先在当前作用域中搜索是否有该变量的定义,如果有,就是用这个变量;如  果没有就到父域中寻找该变量. 由于变量提升,因此在实际开发的时候,推荐将变量都写在开始的地方,也就是在函数的开头将变量就定义好.

接着再来看看原型链

原型链

在 Javascript 中, 每一个对象 o 都具有 proto 属性(这个属性在IE9 以下没有暴露出来),被称为原型 ,根据属性搜索原则 对象 o 可以通过.或者 [] 读取原型的属性,但是当写入时,不会在原型上修改属性,而是直接在对象 o 上添加.
当然,原型也是对象,原型也有proto 属性, 子子孙孙无穷尽也 ~~~

真的是无穷尽吗,当然不是 !

var obj = {a: 'pawn'};

上面通过对象字面值的方式申明了一个对象 obj,并且拥有属性 a .

SBV9)7ZHQUBPLXK%]_O_XHE.png

由于 o.proto === Object.prototype,那么可以认为这种方式等价于

var obj = new Object({a: 10});

所以,o 是继承自 Object.prototype,但 Object.prototype 也是对象,它继承自什么呢?

_@WYR)K_YX~34IMOD4$SY(Y.png

好吧,它继承自 null , 万剑归宗。

好了,现在找到了原型链的第一条子链

79RK{OGUI1MWRO4%07JWTR1.png
我们在来看 function

var func = function() {}

通过字面值声明一个function
同理

G[4O_QP59FU09{D]]{H$ULN.png

func 继承自Function.prototype,那 Function.prototype 也是对象,它继承自什么呢?

威购商城系统
威购商城系统

威购商城2010是2010年推出的一套升级后的超大型网络购物多用户网上商城系统,该系统继承了此前威购多用户网上商城的优秀特点,在原有的基础上进行了重新开发,代码的重新编写,优化以及大规模的改良。增加了多套店铺模版以及加强了团购功能。此系统的推出表明公司有实力把网店系统做的更好。此系统界面美观,后台功能强大,操作的人性化,简洁化给用户的操作带来了许多方便。   该网上商城系统功能强大、可扩展性强:以

下载

B@)Z9B9$NKHIECGTYXKIVQ1.png

可以看到,Function.prototype 继承自Object.prototype,这也就回到了上一条链子.

BXFJFE`TMWN1Q6~DVF4_NOL.png

好了,那现在引入一个问题,Function 本身也是函数,那 Function继承自哪呢? 当然是 Function.prototype,所以JS中最乱伦的东西出现了,Function 是自己的老子,即

~(SB`8QR@25[YU%A0HMW_54.png

TPF}FON`4OTJ}`H(56MO_H1.png

那 Object 也是函数,Object 也当然继承自 Function.prototype

3ZNDBRC3_UQMR%}WUGI}C0P.png

好了,这就是所有原型链的东西

看起来好像很乱,盗 JK老师 一张图, 详细说明这个问题

_ASR$_97EXR7(U[X2YW%C5D.png

现在做一个总结

    1、所有的函数都继承自 Function.prototype,Function,Object 是函数,所以继承自 Function.prototype

    2、所有的对象都直接或间接继承自 Object.prototype,Function.prototype.proto === Object.prototype函数也是对象,所以函数最终继承自Object.prototype .

    3、Object.prototype 继承自 null,万剑归宗

原型继承

看完了原型链,再看原型继承就简单了

var ProtoHerite = function(source) {
  var o = {};
  if(o.proto){
    o.proto = source;
    return o;
  }

  var F = function() {};
  F.prototype = source;
  return new F();
}

这个函数返回的对象原型继承自 source,这也是 Object.create(source) 实现思路.

原型链继承固然很强大,但是也有一些问题,比如共享的原型属性容易被修改,在创建子类型的实例时,不能向超类传参数,等等。

相关专题

更多
c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

26

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

24

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

72

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

10

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

52

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

183

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

12

2026.01.09

php网站搭建教程大全
php网站搭建教程大全

本合集专为零基础用户打造,涵盖PHP网站搭建全流程,从环境配置到实战开发,免费、易懂、系统化,助你快速入门建站!

8

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.1万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号