原型对象也是普通的对象,并且也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链(prototype chain)。

ECMAScript没有类的概念。但是,重用[reuse]这个理念没什么不同(某些方面,甚至比class-更加灵活),可以由prototype chain原型链来实现。这种继承被称为delegation based inheritance-基于继承的委托,或者更通俗一些,叫做原型继承。

构造函数(Constructor)

除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object) 。原型对象存放于 ConstructorFunction.prototype 属性中。

例如,我们重写之前例子,使用构造函数创建对象“b”和“c”,那么对象”a”则扮演了“Foo.prototype”这个角色:

// 构造函数function Foo(y) {// 构造函数将会以特定模式创建对象:被创建的对象都会有"y"属性  this.y = y;}

// "Foo.prototype"存放了新建对象的原型引用// 所以我们可以将之用于定义继承和共享属性或方法// 所以,和上例一样,我们有了如下代码:

// 继承属性"x"Foo.prototype.x = 10;

// 继承方法"calculate"Foo.prototype.calculate = function (z) {return this.x + this.y + z;};

// 使用foo模式创建 "b" and "c"var b = new Foo(20);var c = new Foo(30);

// 调用继承的方法b.calculate(30); // 60c.calculate(40); // 80

// 让我们看看是否使用了预期的属性

console.log(

  b.__proto__ === Foo.prototype, // true  c.__proto__ === Foo.prototype, // true

// "Foo.prototype"自动创建了一个特殊的属性"constructor"  // 指向a的构造函数本身  // 实例"b"和"c"可以通过授权找到它并用以检测自己的构造函数

  b.constructor === Foo, // true  c.constructor === Foo, // true  Foo.prototype.constructor === Foo // true

  b.calculate === b.__proto__.calculate, // true  b.__proto__.calculate === Foo.prototype.calculate // true

);

上述代码可表示为如下的关系:

图 3. 构造函数与对象之间的关系

上述图示可以看出,每一个object都有一个prototype. 构造函数Foo也拥有自己的__proto__, 也就是Function.prototype, 而Function.prototype的__proto__指向了Object.prototype. 重申一遍,Foo.prototype只是一个显式的属性,也就是b和c的__proto__属性。

作用域链(Scope Chains)

作用域链的原理和原型链很类似,如果这个变量在自己的作用域中没有,那么它会寻找父级的,直到最顶层。

标示符[Identifiers]可以理解为变量名称、函数声明和普通参数。例如,当一个函数在自身函数体内需要引用一个变量,但是这个变量并没有在函数内部声明(或者也不是某个参数名),那么这个变量就可以称为自由变量[free variable]。那么我们搜寻这些自由变量就需要用到作用域链。

在一般情况下,一个作用域链包括父级变量对象(variable object)(作用域链的顶部)、函数自身变量VO和活动对象(activation object)。不过,有些情况下也会包含其它的对象,例如在执行期间,动态加入作用域链中的—例如with或者catch语句。[译注:with-objects指的是with语句,产生的临时作用域对象;catch-clauses指的是catch从句,如catch(e),这会产生异常对象,导致作用域变更]。

(感谢汤姆大叔的bog,受益匪浅,感谢!在此只是做记录,便于记忆)

转载于:https://www.cnblogs.com/gfqFighting/archive/2012/09/27/2706234.html

汤姆大叔JavaCript系列10阅读笔记相关推荐

  1. 汤姆大叔JavaCript系列10阅读笔记1

    闭包(Closures) 在ECMAScript中,函数是"第一类"对象.这个名词意味着函数可以作为参数被传递给其他函数使用 (在这种情况下,函数被称为"funargs& ...

  2. 汤姆大叔JavaCript系列3阅读笔记

    Module模式: var blogModule = (function () {var my = {}, privateName = "博客园"; function privat ...

  3. 汤姆大叔 MVC6 系列教程网摘

    解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 & MVC6系列(2):初识项目 解读ASP.NET 5 & MVC6系列(3) ...

  4. 汤姆大叔深入理解JavaScript 学习笔记

    myname = "global"; // 全局变量 function func() {alert(myname); // "undefined"var myn ...

  5. 深入理解JavaScript系列(转自汤姆大叔)

    深入理解JavaScript系列(转自汤姆大叔) 深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaSc ...

  6. [转载]深入理解JavaScript系列 --汤姆大叔

    深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...

  7. 汤姆大叔(深入理解JavaScript系列)收藏

    这事汤姆大叔总结的JavaScript系列文章,我做了链接收藏,方便以后查询. 深入理解JavaScript系列

  8. Python表示不甘心,汤姆大叔送书,Python抢书之毫秒级跟进--获取服务器时间

    @鲜宏大牛果断使用js将抢书的误差提高到毫秒级, wid表示真心的很佩服鲜宏大牛! wid的水平虽说不怎么样, 但内心说, wid也想尝试着将抢书的误差提高到毫秒级, 思考了一会, 还真有思路了! 现 ...

  9. 汤姆大叔的6道js题目

    汤姆大叔的6道javascript编程题题解 看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) 1 ...

最新文章

  1. Sudo 漏洞隐患不断,macOS 也受牵连!
  2. 什么样的代码为好代码?好代码的科学定义
  3. python写一个系统-使用Python写一个量化股票提醒系统
  4. namesapce的作用 增加访问路径 目的:区分不同包的相同action的访问路径
  5. .NET Core / C# 开发 IOT 嵌入式设备的个人见解
  6. php返回并中断,php – 如何从回调函数返回控件或中断array_filter处理中的数组处理...
  7. 跨域问题解决(我只是搬运工)
  8. 【redis】分布式锁实现,与分布式定时任务
  9. socket python udp_python-socket UDP
  10. 大数据时代的教育宏观治理体制现代化变革
  11. CentOS 6.5 安装Redis并设置开机自启动
  12. kettle登录加载job 报错 Can't find Job 1
  13. Linux命令和shell脚本 重点
  14. 软件测试工程师发展前景好吗?
  15. 相濡以沫还是想忘于江湖
  16. NTP对时服务器(NTP电子时钟)在生物制药业应用
  17. element Dropdown二级下拉菜单
  18. 计算机硬盘无法启动怎么办,电脑开机找不到硬盘怎么办?
  19. 【面试题目】你有12个硬币,其中有一个的重量与其他的不一样,有三次使用测量平衡的机会来找出重量不同的那个。该怎么做呢?
  20. 人是Web3最终进化

热门文章

  1. 无线图传mjpg-streamer精简版(开源)
  2. oracle应用端改端口,oracle 数据库修改默认端口
  3. 语义分割数据集VOC2012 FCN网络结构详解
  4. matlab怎么三维图形旋转45度,是否可以在matlab中将矩阵旋转45度
  5. VMware中ubuntu虚拟机重启后找不到ens33网卡问题
  6. Python 处理 PDF —— PyMuPDF 的安装与使用
  7. redis存php对象吗,redis怎么存储对象
  8. oracle select into 查询没有记录的解决办法
  9. 在tagxedo.com在线制作可视化词云
  10. 数位dp 最高位和最低位差值_炒股这13年,一直只用一个冷门指标!终于做到买在最高位,卖在最低位!这才是炒股最合适方式!...