深入JavaScript(2) - 对象, 一切皆对象?
书接上文..
JavaScript 设计 prototype 的目的就是为了继承, 所以不要把 prototype 用作其它目的.
为什么 JavaScript 使用 prototype 来实现继承呢? 因为 JavaScript 诞生的最初目的是为了实现前端表单验证, 当时的 Internet 太慢了, 传到后台验证等不起. 所以 JavaScript 的作者认为没有必要把继承设计的像 Java 里那样复杂, 就选了用 prototype.
- Undefined类型: 只有一个值 undefined. 一个变量没有被赋值的时候就是该值.
- 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 */
这篇里讲的都是内置的东西, 也是基础! 理解好之后继承就好理解了, 关系也清楚了.
如果还是迷糊, 为什么是上面那个样子, 有一招, 记住它们是乌龟的屁股 -- 规定!
之后会写我们自己创建的对象是什么样子, 绳子把谁绑在一起了呢?
待续...