`
hbc8848
  • 浏览: 17013 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Javascript 的函数式对象(一)利用闭包模拟类的私有变量和方法

阅读更多
        在Javascript的框架开发中,面向对象式编程和面向函数式编程各有长处,因况而异。
除了在单例工厂中设置一些类型常量外,闭包通常被用来模拟类的私有变量和方法。
结合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中去,以节省浏览器的内存开销。

3
2
分享到:
评论
6 楼 hbc8848 2011-01-17  
bigbighead 写道
hbc8848 写道
回答一下:
2. 这里你指的上级对象MyNamespace只是用来做一个命名空间的划分,并不是你可能期望的“继承”,如果你希望看到继承的话,该系列的后几篇文章会提到我推荐的js继承方式。


博主,你好!
我这里说的不是“继承”。
在我们讨论的这个例子中,你先创建了一个对象 MyNamespace
然后给这个对象动态增加一个属性叫TreeItem
从语法上讲,TreeItem是MyNamespace对象的成员
(不知道,我这样说对不对)
我的问题是,如何在成员变量中 访问所在对象的属性。
为了把问题说的更清楚,我举个例子:
var MyNamespace = {};
MyNamespace.name = "abc";
MyNamespace.action = function(){...};
MyNamespace.TreeItem = function (){  
   //这里面 如何访问 MyNamespace.name属性或action 函数
}



因为这里的 MyNamespace 是这样定义出来的:var MyNamespace = {} 所以它可被看作是java里的单例模式,所以可以用如下方法访问 MyNamespace.name属性或action 函数:
var MyNamespace = {};  
MyNamespace.name = "abc";  
MyNamespace.action = function(){};  
MyNamespace.TreeItem = function (){    
   //这里用全名访问 MyNamespace.name属性或action 函数  
   alert( MyNamespace.name );
};
MyNamespace.TreeItem();
5 楼 biyelei 2011-01-13  
不错
4 楼 bigbighead 2010-11-18  
hbc8848 写道
回答一下:
2. 这里你指的上级对象MyNamespace只是用来做一个命名空间的划分,并不是你可能期望的“继承”,如果你希望看到继承的话,该系列的后几篇文章会提到我推荐的js继承方式。


博主,你好!
我这里说的不是“继承”。
在我们讨论的这个例子中,你先创建了一个对象 MyNamespace
然后给这个对象动态增加一个属性叫TreeItem
从语法上讲,TreeItem是MyNamespace对象的成员
(不知道,我这样说对不对)
我的问题是,如何在成员变量中 访问所在对象的属性。
为了把问题说的更清楚,我举个例子:
var MyNamespace = {};
MyNamespace.name = "abc";
MyNamespace.action = function(){...};
MyNamespace.TreeItem = function (){  
   //这里面 如何访问 MyNamespace.name属性或action 函数
}

3 楼 hbc8848 2010-11-18  
回答一下:
1. this 关键字的用法有很多。该例的this指的是:一个方法中的this指的是调用了该方法的对象。如在 treeItem.setLabel() 这段代码中:treeItem 调用了setLabel方法,那么setLabel 方法中的this指的就是treeItem。 如果setLabel这个方法被赋给了另一个对象tabItem,那么this指的就是tabItem。

2. 这里你指的上级对象MyNamespace只是用来做一个命名空间的划分,并不是你可能期望的“继承”,如果你希望看到继承的话,该系列的后几篇文章会提到我推荐的js继承方式。
2 楼 bigbighead 2010-11-18  
刚刚学习JavaScript
在此先向博主表达深深的敬仰之情。

问两个问题:
1.在TreeItem的声明中,使用this关键字,这个应该是指向TreeItem实例的吧?
2.如何在TreeItem中访问其上级对象的成员呢?
  比如MyNamespace有一个 getName()函数
  这里怎么访问到?

1 楼 bigbighead 2010-11-18  

相关推荐

    javaScript 利用闭包模拟对象的私有属性

    JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument

    深度探讨javascript函数的原型链和闭包

    深度探讨javascript函数的原型链和闭包

    理解javascript函数式编程中的闭包(closure)_.docx

    理解javascript函数式编程中的闭包(closure)_.docx

    JavaScript闭包函数访问外部变量的方法

    主要介绍了JavaScript闭包函数访问外部变量的方法,本文使用匿名函数来实现在闭包中访问外部变量,需要的朋友可以参考下

    javascript使用闭包模拟对象的私有属性和方法

    本文给大家简单介绍了在一个项目中涉及到的javascript使用闭包模拟对象的私有属性和方法,这里记录下来,分享给大家。

    JavaScript函数式编程

    全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...

    JS匿名函数、闭包

    即使JavaScript中没有正式的私有对象属性的概念,但可以使用闭包来实现公有方法,而通过公有方法可以访问在包含作用域中定义的变量; 有权访问私有变量的公有方法叫做特权方法; 可以使用构造函数模式、原型模式...

    javaScript函数式编程

    全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量的作用域和闭包、高阶函数、由函数构建函数、递归、纯度和不变性以及更改政策、基于流的编程、类编程。除此之外,附录中还介绍了更多...

    JavaScript闭包函数

    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...

    理解javascript函数式编程中的闭包(closure)

    主要帮助大家理解javascript函数式编程中的闭包(closure)概念,通俗地讲, JavaScript 中每个的函数都是一个闭包,感兴趣的小伙伴们可以参考一下

    JavaScript私有变量实例详解

    本文实例讲述了JavaScript私有变量。...如果在这个函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量,利用这一点,就可以创建用于访问私有变量的公有方法。 有权访问私有变量和私有函数的公有方法

    js代码-函数表达式 闭包 私有变量

    js代码-函数表达式 闭包 私有变量

    JavaScript碎片—函数闭包(模拟面向对象)

    具体来说实现模拟面向对象主要是利用JavaScript函数闭包这个概念。由于JavaScript中的每一个function都会形成一个作用域,而如果变量声明在这个域中,那么外部是无法直接去访问,要想访问必须new出一个实例来,相当...

    【JavaScript源代码】详解JavaScript闭包问题.docx

     闭包是纯函数式编程语言的传统特性之一。通过将闭包视为核心语言构件的组成部分,JavaScript语言展示了其与函数式编程语言的紧密联系。由于能够简化复杂的操作,闭包在主流JavaScript库以及高水平产品代码中日益...

    深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解

    本篇文章对Javascript中函数、递归与闭包(执行环境、变量对象与作用域链)的使用进行了详细的分析介绍。需要的朋友参考下

Global site tag (gtag.js) - Google Analytics