深入JavaScript(1) - 基础
要深入JavaScript, 下面的一些名词出现的频率非常高, 有些名字又很相近, 所以容易变得迷惑不清, 所以在理解就会限入不良的循环, 可能会感觉在用不理解的东西去解释一个新东西, 后果可想而知. 如下是ECMAScript规范, 也是JavaScript实现的标准, 如果我们把最基础的东西, 也就是用来解释其它机制的东西都弄清楚了, 理解高级特性的时候就会变得容易了.
- 类型(Type): 数据的集合
- 原始值(Primitive Value): 只能是 Undefined, Null, Boolean, Number or String其中之一的值. 如: undefined, null, true / false, 3.1415926, "Hello world!"
- 对象(object): 是Object类型的一员(注意大小写), 它是一些无序的,属性的集合; 属性可以是原始值, 另一个对象 或一个函数. 保存在对象属性里的函数通常叫做方法(method).
- 构造函数(Constructor): constructor 是一个函数对象(Function object). 好吧, 这里出现一个让人迷惑的词: 函数对象. 这里先不详细解释, 记住既然它叫做构造函数, 那它自然是一个函数, 以后会讲. 每个构造函数必定有一个原型对象(prototype object), JavsScript里用它来实现继承和属性共享. 继承是高级应用, 以后再说. constuctor在继承的实现时是一个需要留神的地方.
*任何函数都可以是构造函数, 但是并不是所有的函数都适合做构造函数, 要看我们定义这个函数的目的是什么.
var add = function(m, n) { return m + n; } var sum = add(3, 6); // 有实际意义, 完成特定功能的模块 var foo = new add(); // 像它的名字foo一样, 毫无意义, 但是无意义并不代表把add作为构造函数来用会产
//生语法 / 句法的错误! 仅仅是没有意义. var Book = function(bookName) { this.bookName = bookName; } var book = Book("JaveScript权威指南"); // 就上面的代码来看, 毫无意义 var myFavourateBook = new Book("JaveScript权威指南"); // 作为构造函数, 用来产生Book的实例. - 原型(prototype): 原型属性指向的是一个对象! 一般叫它原型对象. JavaScript用它来实现好的继承机制.
当构造函数(constructor) C(假设为构造函数的名字)创建一个新对象newObj的时候, newObj会有一个隐式的引用, 到构造函数C的prototype上. 让人迷惑, 请看代码和注释
var C = function() { // 构造函数. 为什么这样定义? 为什么是一个函数 而不是 C = {}? // 可以这样记, 抛弃一切高级概念, // 既然叫构造函数, 那它就是一个函数, 所以要用函数定义或函数表达式这种形式. // 按高级OOP语言(如Java, C++, ...)的惯例, 首字母要大写 } var newObj = new C(); C.prototype; // newObj会隐式的引用这个对象 // newObj会隐式的引用, 为什么用"隐式"这个词? // 因为我们不能像 C.prototype 这种表达式直接引用到, 他是语言内部实现的东西. // 但是在Chrome中我们可以用 __proto__ 这个属性来访问到这个隐式的连接, 程序中是不应该这么用的, // Chrome应该是为了方便开发者才提供这样的访问. newObj.__proto__ === C.prototype; // true // 把上面这句翻译成中文就是: 用构造函数C创建的新对象newObj, // 隐式的引用(newObj.__proto__)到了构造函数的原型对象(C.prototype).
待续... 欢迎指正, 共同进步. 后面就是涉及宿住环境的对象, 和内建对象一些说明. 这些是开始, 可能看到上面关于prototype介绍, 还是一大堆问号, 在以后会继续一点点的写 :) 尽量每一篇的topic少, 内容多 :)