Page 161 - Node.js开发指南
P. 161
154 附录 A JavaScript 的高级特性
表示这个属性是私有的,外部对象不应该直接读写它。但这只是个非正式的约定,假设对象
的使用者不这么做,有没有更严格的机制呢?答案是有的,通过闭包可以实现。让我们再看
看前面那个例子:
var generateClosure = function() {
var count = 0;
var get = function() {
count ++;
return count;
};
return get;
};
var counter = generateClosure();
console.log(counter()); // 输出 1
console.log(counter()); // 输出 2
console.log(counter()); // 输出 3
我们可以看到,只有调用 counter() 才能访问到闭包内的 count 变量,并按照规则
对其增加1,除此之外决无可能用其他方式找到 count 变量。受到这个简单例子的启发,
我们可以把一个对象用闭包封装起来,只返回一个“访问器”的对象,即可实现对细节隐藏。
关于实现JavaScript对象私有成员的更多信息,请参考http://javascript.crockford.com/private.html。
A.3 对象
提起面向对象的程序设计语言,立刻让人想起的是 C++、Java 等这类静态强类型语言,
以及 Python、Ruby 等脚本语言,它们共有的特点是基于类的面向对象。而说到 JavaScript,
很少能让人想到它面向对象的特性,甚至有人说它不是面向对象的语言,因为它没有类。没
错,JavaScript 真的没有类,但 JavaScript 是面向对象的语言。JavaScript 只有对象,对象就
是对象,不是类的实例。
因为绝大多数面向对象语言中的对象都是基于类的,所以经常有人混淆类的实例与对象
的概念。对象就是类的实例,这在大多数语言中都没错,但在 JavaScript 中却不适用。
JavaScript 中的对象是基于原型的,因此很多人在初学 JavaScript 对象时感到无比困惑。通过
这一节,我们将重新认识 JavaScript 中对象,充分理解基于原型的面向对象的实质。
A.3.1 创建和访问
JavaScript 中的对象实际上就是一个由属性组成的关联数组,属性由名称和值组成,值
的类型可以是任何数据类型,或者函数和其他对象。注意 JavaScript 具有函数式编程的特性,
所以函数也是一种变量,大多数时候不用与一般的数据类型区分。