深入JavaScript - 对象, 一切皆对象?

王朝学院·作者佚名  2016-04-26
窄屏简体版  字體: 小  |  中  |  大  |  超大  

书接上文..

javaScript 设计 PRototype 的目的就是为了继承, 所以不要把 prototype 用作其它目的.

为什么 Javascript 使用 prototype 来实现继承呢? 因为 JavaScript 诞生的最初目的是为了实现前端表单验证, 当时的 Internet 太慢了, 传到后台验证等不起. 所以 JavaScript 的作者认为没有必要把继承设计的像 Java 里那样复杂, 就选了用 prototype.

Undefined类型: 只有一个值 undefined. 一个变量没有被赋值的时候就是该值.

Null类型: 只有一个值 null. 对象的值故意留空的时候为该值.

这里是一个有趣的地方:

?

1

2

3

undefined == null; // true

undefined === null; // false

我记得这种结果的原因是, null是从undefined派生出来的.

-----------------

JavaScript规范里写着有三种对象: 原生对象, 内置对象; 宿主对象

原生对象包含内置对象, 在程序执行之间就存在的对象.

宿主对象由宿主环境提供, 比如: 浏览器, Adobe软件等

在内置对象中, 有一大部分有点特殊功能! 那就是函数对象!!

那么语言内部是怎么标识的呢? 有一个内部属性[[Class]]

如果是一般的对象, 内部[[Class]]属性值为 "Object";

如果是函数对象, 内部的[[Class]]属性值为 "Function";

函数对象有的是普通函数, 比如: parseInt();

而有的又有一些特殊功能, 就是可以当构造器用, 叫做构造函数, 它们会在内部实现 [[Construct]] 方法, 比如 Array();

注意这里, parseInt() and Array() 都是函数对象, 都是对象!!

---------

所有函数对象会隐式的引用 Function.prototype (为什么? 乌龟的屁股 -- 规定!)

所有内置的原型对象, 会隐式的引用 Object.prototype. (为什么? 乌龟的屁股 -- 规定!)

看到这儿, 细心的人可能会有个疑问, Object.prototype也是内置的原型对象, 它也会自己隐式的引用自己? 怎么这么奇怪?

答: 是有点混乱, 于是有了 补充规定: 除了 Object.prototype , 其它内置原型对象会隐式的引用 Object.prototype

怎么通过代码来检测上面给出的定理一样的东西呢.. 还记得在上篇中 prototype隐式的引用可以用 __ proto__ 来访问.

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// 下面是一些 完全等于 关系, 大家可以把 ".__proto__ === " 想像成一条绳索, 可以

// 把左右两个对象串联起来. 假如找一个属性, 在左边没找到的话, 就会沿着绳索爬过右

// 边继续边, 要是没找到就继续往右爬 - -, 直接到最后爬到一个null - 空对象上.

// 内置函数对象隐式引用 Function的原型对象

parseInt.__proto__ === Function.prototype

Array.__proto__ === Function.prototype

Object.__proto__ === Function.prototype

// 注意 Function 自己也不例外

Function.__proto__ === Function.prototype

// 内置原型对象隐式引用 Object 的原型对象

Function.prototype.__proto__ === Object.prototype

Array.prototype.__proto__ === Object.prototype

// 再来一个等式, 原型链的终点

Object.prototype.__proto__ === null

/*

通过上面的等式, 我们可以建立起一些绳索(把 .__proto__ === 替换成绳子!):

parseInt() ~~~ Function.prototype ~~~ Object.prototype ~~~ null

Array() ~~~ Function.prototype ~~~ Object.prototype ~~~ null

Object() ~~~ Function.prototype ~~~ Object.prototype ~~~ null

Function() ~~~ Function.prototype ~~~ Object.prototype ~~~ null

*/

这篇里讲的都是内置的东西, 也是基础! 理解好之后继承就好理解了, 关系也清楚了.

如果还是迷糊, 为什么是上面那个样子, 有一招, 记住它们是乌龟的屁股 -- 规定!

之后会写我们自己创建的对象是什么样子, 绳子把谁绑在一起了呢?

待续...

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航