javaScript 设计 PRototype 的目的就是为了继承, 所以不要把 prototype 用作其它目的. 为什么 Javascript 使用 prototype 来实现继承呢? 因为 JavaScript 诞生的最初目的是为了实现前端表单验证, 当时的 Internet 太慢了, 传到后台验证等不起. 所以 JavaScript 的作者认为没有必要把继承设计的像 Java 里那样复杂, 就选了用 prototype. - Undefined类型: 只有一个值 undefined. 一个变量没有被赋值的时候就是该值.
- Null类型: 只有一个值 null. 对象的值故意留空的时候为该值.
这里是一个有趣的地方: 1 2 3 | undefined == null ; undefined === null ;
| 我记得这种结果的原因是, 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 | parseInt.__proto__ === Function.prototype Array.__proto__ === Function.prototype Object.__proto__ === Function.prototype Function.__proto__ === Function.prototype Function.prototype.__proto__ === Object.prototype Array.prototype.__proto__ === Object.prototype Object.prototype.__proto__ === null | 这篇里讲的都是内置的东西, 也是基础! 理解好之后继承就好理解了, 关系也清楚了. 如果还是迷糊, 为什么是上面那个样子, 有一招, 记住它们是乌龟的屁股 -- 规定! |