除了模拟类的私有变量和私有方法。闭包还可用来模拟类的静态变量和方法。
除了再次利用js的闭包特性,还需要借助js语法上的一些特点。看下面一段代码:
var MyNamespace = {}; // 定义命名空间
MyNamespace.TreeItem = (function(){
//使用闭包产生的私有静态变量,不可被外部访问
var numTreeItems = 0;
//使用闭包产生的私有静态方法,不可被外部访问
function counter(){
numTreeItems ++;
console.log("Created "+numTreeItems+" tree items!");
}
//该匿名函数的引用将被赋予MyNamespace.TreeItem
return function(){
//使用闭包产生的私有类变量,不可被外部访问
var label;
//可访问私有变量,也可被外部访问的方法
this.setLabel = function( newLabel ){
label = newLabel;
};
this.getLabel = function(){
return label;
};
//该方法用来累计实例的数量
counter();
}
})(); //在函数定义的末尾加上括号,表示该函数在定义后立即执行
//不可访问私有变量以及其它公共方法的静态公共方法
MyNamespace.TreeItem.clone = function(otherInstance){
};
MyNamespace.TreeItem.prototype = {
// 不可访问私有变量,但可访问其它公共方法的公共方法
print: function(){
console.log(this.getLabel());
}
};
var treeItem1 = new MyNamespace.TreeItem(); // print 1
var treeItem2 = new MyNamespace.TreeItem(); // print 2
执行上述代码后,浏览器控制台将会输出如下字符串:
Created 1 tree items!
Created 2 tree items!
之所以把上述一些js变量和函数称为“静态”,是借用了Java的提法。
这些“静态”变量和方法被保存在闭包中,在内存中是唯一的,
不会随着该函数副本的增加而增加。如果一个函数需要被实例化多次,
但其中的一些内部函数并不需要访问任何实例数据,从节省内存的角度考虑,
可采用上述构建静态函数的方法。js中的“静态”概念,有一点与Java不同:
如果上述TreeItem被设为null,即不再有引用指向它,那么它的闭包也将消失,
保存在闭包中的静态变量和方法,也将被垃圾回收器择机回收。
分享到:
相关推荐
深度探讨javascript函数的原型链和闭包
理解javascript函数式编程中的闭包(closure)_.docx
主要介绍了JavaScript闭包函数访问外部变量的方法,本文使用匿名函数来实现在闭包中访问外部变量,需要的朋友可以参考下
全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...
全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...
JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
主要帮助大家理解javascript函数式编程中的闭包(closure)概念,通俗地讲, JavaScript 中每个的函数都是一个闭包,感兴趣的小伙伴们可以参考一下
匿名函数,也称为拉姆达函数,是一种使用JavaScript...JavaScript中的匿名函数和闭包都是非常有用的特性,利用它们可以实现很多功能。不过,因为创建闭包必须维护额外的作用域,所以过度使用它们可能会占用大量内存。
具体来说实现模拟面向对象主要是利用JavaScript函数闭包这个概念。由于JavaScript中的每一个function都会形成一个作用域,而如果变量声明在这个域中,那么外部是无法直接去访问,要想访问必须new出一个实例来,相当...
面向对象概念(对象封装,各种继承,闭包原理,this作用域等)介绍清晰易懂
通过将闭包视为核心语言构件的组成部分,JavaScript语言展示了其与函数式编程语言的紧密联系。由于能够简化复杂的操作,闭包在主流JavaScript库以及高水平产品代码中日益流行起来。 一、变量的作用域 在介绍闭包...
本篇文章对Javascript中函数、递归与闭包(执行环境、变量对象与作用域链)的使用进行了详细的分析介绍。需要的朋友参考下
javascript笔记之匿名函数和闭包.docx
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
在Laravel控制器写两个方法,一个是在内部创建一个闭包函数,一个是执行传过来的闭包函数,测试闭包的写法,use使用外部变量,及闭包函数的传参。如下: //测试闭包传参及use使用外部变量 public function ...
本文给大家简单介绍了在一个项目中涉及到的javascript使用闭包模拟对象的私有属性和方法,这里记录下来,分享给大家。