【JS-task05】简述原型链是什么,有什么用处?若想访问一个对象的原型,应该使用什么方法?

小课堂【武汉小课堂】

分享人:严泽浩

目录

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

ECMAScript 中描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原 型让一个引用类型继承另一个引用类型的属性和方法。简单回顾一下构造函数、原型和实例的关系:每 个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型 对象的内部指针。那么,假如我们让原型对象等于另一个类型的实例,结果会怎么样呢?显然,此时的 原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数 的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实 例与原型的链条。这就是所谓原型链的基本概念。

2.知识剖析

一、原型指针__proto__

在JavaScript中,每个对象都拥有一个原型对象,而指向该原型对象的内部指针则是__proto__,通过它可以从中继承原型对象的属性, 原型是JavaScript中的基因链接,有了这个,才能知道这个对象的祖祖辈辈。从对象中的__proto__可以访问到他所继承的原型对象。

二、JavaScript原型对象prototype

函数实例除了拥有__proto__属性之外,还拥有prototype属性。通过该函数构造的新的实例对象, 其原型指针__proto__会指向该函数的prototype属性。而函数的prototype属性,本身是一个由Object构造的实例对象

3.常见问题

访问对象原型的方法有哪些 ?

4.解决方案

获取实例对象obj的原型对象,有三种方法

  1. obj.__proto__
  2. obj.constructor.prototype
  3. Object.getPrototypeOf(obj)

上面三种方法之中,前两种都不是很可靠。最新的ES6标准规定,__proto__属性只有浏览器才需要部署, 其他环境可以不部署。而obj.constructor.prototype在手动改变原型对象时,可能会失效。

5.编码实战

6.扩展思考

原型链与继承的关系

继承是 OO 语言中的一个最为人津津乐道的概念。许多 OO 语言都支持两种继承方式:接口继承和 实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。如前所述,由于函数没有签名, 在 ECMAScript 中无法实现接口继承。ECMAScript 只支持实现继承,而且其实现继承主要是依靠原型链 来实现的。

7.参考文献

参考书籍:JavaScript高级程序设计(第三版)

参考链接:Javascript继承机制的设计思想

8.更多讨论

鸣谢

感谢大家观看

BY : 严泽浩

Contact GitHub API Training Shop Blog About © 2016 GitHub, Inc. Terms Privacy Security Status He