日期:2014-05-16 浏览次数:20358 次
优雅的封装还是执行的效率?这是一个悖论。
优雅封装的程序看起来是那么的美妙:每个属性被隐藏在对象之后,你所能看到的就是这个对象让你看到的,至于它到底是怎么操作的,这个不需要你操心。
执行的效率就是另外一回事。就像是C语言和面向对象的C++之间的差别:C++很优雅,但是执行效率,无论是编译后的二进制代码还是运行期的内存的占用,都要比简单的C语言多出一截来。
这个问题在脚本语言中显得更加重要,因为JavaScript根本就是一种解释语言,解释语言的执行效率要比编译语言低很多。
1. 优雅的封装
我们先来看看变量封装。这里的变量不仅仅是属性,也包括函数。
前面已经说过,JavaScript中并没有类这个概念,是我们利用变量作用域和闭包“巧妙的模拟”出来的,这是一种优雅的实现。还是温故一下以前的代码:
function Person() { var id; var showId = function() { alert("My id is " + id); } this.getId = function() { return id; } this.setId = function(newId) { id = newId; } } var p = new Person(); p.setId(1000); alert(p.id); // undefined // p.showId(); error: function not defined var p2 = new Person(); alert(p.getId == p2.getId); // false?
好在JavaScript中还有一个机制:prototype。还记得这个prototype吗?每个对象都维护着一个prototype属性,这些对象的prototype属性是共享的。那么,我们就可以把函数的定义放到prototype里面,于是,不同的对象不就共享了一份代码拷贝吗?事实确实如此:
function Person() { } Person.prototype.show = function() { alert("I'm a person."); } var p1 = new Person(); var p2 = new Person(); alert(p1.show == p2.show); // true?
function Person() { Person.prototype.show = function() { alert("I'm a person."); } } var p1 = new Person(); var p2 = new Person(); alert(p1.show == p2.show); // true?