在Javascript的框架开发中,面向对象式编程和面向函数式编程各有长处,因况而异。
除了在单例工厂中设置一些类型常量外,闭包通常被用来模拟类的私有变量和方法。
结合js的prototype机制,一个具有面向对象特点的js函数能够被以减少内存占用的形式实例化出来。
每创建一个新的TreeItem实例,内存会为其私有变量,私有方法和所有能够访问私有变量和私有方法的方法开辟物理空间,而prototype中的方法始却始终只有一个。因此我们可以将那些不需要保存自身状态信息的方法放到js函数式对象的prototype中去,以节省浏览器的内存开销。
除了在单例工厂中设置一些类型常量外,闭包通常被用来模拟类的私有变量和方法。
结合js的prototype机制,一个具有面向对象特点的js函数能够被以减少内存占用的形式实例化出来。
var MyNamespace = {};
MyNamespace.TreeItem = function (){
//使用闭包产生的私有类变量
var label, icon;
//可访问私有变量,但不可被外部访问的私有方法
function validate(){
}
//可访问私有变量,也可被外部访问的方法
this.setLabel = function( newLabel ){
label = newLabel;
validate();
};
this.getLabel = function(){
return label;
};
this.setIcon = function( newIcon ){
icon = newIcon;
validate();
};
this.getIcon = function(){
return icon;
};
};
// 该方法可被外部访问,却只能通过取/赋值器访问私有类变量
MyNamespace.TreeItem.prototype = {
print: function(){
console.log( this.getLabel() );
}
}
//实例化TreeItem类并调用其公共方法
var treeItem = new MyNamespace.TreeItem();
treeItem.setLabel('Hello World!');
treeItem.print();
每创建一个新的TreeItem实例,内存会为其私有变量,私有方法和所有能够访问私有变量和私有方法的方法开辟物理空间,而prototype中的方法始却始终只有一个。因此我们可以将那些不需要保存自身状态信息的方法放到js函数式对象的prototype中去,以节省浏览器的内存开销。