深入JavaScript(2) - 对象, 一切皆对象?

书接上文..

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

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

  1. Undefined类型: 只有一个值 undefined. 一个变量没有被赋值的时候就是该值.
  2. Null类型: 只有一个值 null. 对象的值故意留空的时候为该值.

这里是一个有趣的地方:

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__ 来访问.

// 下面是一些 完全等于 关系, 大家可以把 ".__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
*/

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

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

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

待续...

posted @ 2013-04-28 18:15  zhongsp  阅读(1912)  评论(10编辑  收藏  举报