汤姆大叔JavaCript系列10阅读笔记
原型对象也是普通的对象,并且也有可能有自己的原型,如果一个原型对象的原型不为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阅读笔记相关推荐
- 汤姆大叔JavaCript系列10阅读笔记1
闭包(Closures) 在ECMAScript中,函数是"第一类"对象.这个名词意味着函数可以作为参数被传递给其他函数使用 (在这种情况下,函数被称为"funargs& ...
- 汤姆大叔JavaCript系列3阅读笔记
Module模式: var blogModule = (function () {var my = {}, privateName = "博客园"; function privat ...
- 汤姆大叔 MVC6 系列教程网摘
解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 解读ASP.NET 5 & MVC6系列(2):初识项目 解读ASP.NET 5 & MVC6系列(3) ...
- 汤姆大叔深入理解JavaScript 学习笔记
myname = "global"; // 全局变量 function func() {alert(myname); // "undefined"var myn ...
- 深入理解JavaScript系列(转自汤姆大叔)
深入理解JavaScript系列(转自汤姆大叔) 深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaSc ...
- [转载]深入理解JavaScript系列 --汤姆大叔
深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...
- 汤姆大叔(深入理解JavaScript系列)收藏
这事汤姆大叔总结的JavaScript系列文章,我做了链接收藏,方便以后查询. 深入理解JavaScript系列
- Python表示不甘心,汤姆大叔送书,Python抢书之毫秒级跟进--获取服务器时间
@鲜宏大牛果断使用js将抢书的误差提高到毫秒级, wid表示真心的很佩服鲜宏大牛! wid的水平虽说不怎么样, 但内心说, wid也想尝试着将抢书的误差提高到毫秒级, 思考了一会, 还真有思路了! 现 ...
- 汤姆大叔的6道js题目
汤姆大叔的6道javascript编程题题解 看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) 1 ...
最新文章
- Sudo 漏洞隐患不断,macOS 也受牵连!
- 什么样的代码为好代码?好代码的科学定义
- python写一个系统-使用Python写一个量化股票提醒系统
- namesapce的作用 增加访问路径 目的:区分不同包的相同action的访问路径
- .NET Core / C# 开发 IOT 嵌入式设备的个人见解
- php返回并中断,php – 如何从回调函数返回控件或中断array_filter处理中的数组处理...
- 跨域问题解决(我只是搬运工)
- 【redis】分布式锁实现,与分布式定时任务
- socket python udp_python-socket UDP
- 大数据时代的教育宏观治理体制现代化变革
- CentOS 6.5 安装Redis并设置开机自启动
- kettle登录加载job 报错 Can't find Job 1
- Linux命令和shell脚本 重点
- 软件测试工程师发展前景好吗?
- 相濡以沫还是想忘于江湖
- NTP对时服务器(NTP电子时钟)在生物制药业应用
- element Dropdown二级下拉菜单
- 计算机硬盘无法启动怎么办,电脑开机找不到硬盘怎么办?
- 【面试题目】你有12个硬币,其中有一个的重量与其他的不一样,有三次使用测量平衡的机会来找出重量不同的那个。该怎么做呢?
- 人是Web3最终进化
热门文章
- 无线图传mjpg-streamer精简版(开源)
- oracle应用端改端口,oracle 数据库修改默认端口
- 语义分割数据集VOC2012 FCN网络结构详解
- matlab怎么三维图形旋转45度,是否可以在matlab中将矩阵旋转45度
- VMware中ubuntu虚拟机重启后找不到ens33网卡问题
- Python 处理 PDF —— PyMuPDF 的安装与使用
- redis存php对象吗,redis怎么存储对象
- oracle select into 查询没有记录的解决办法
- 在tagxedo.com在线制作可视化词云
- 数位dp 最高位和最低位差值_炒股这13年,一直只用一个冷门指标!终于做到买在最高位,卖在最低位!这才是炒股最合适方式!...