原文地址:

http://frugalcoder.us/post/2010/02/11/js-classes.aspx

Classy JavaScript - Best Practices

11. February 2010 13:26

Okay, so you really want to be able to have some of your JavaScript methods to have access to a variable that is private, but maintains state between calls. The first piece of knowledge, is that you can have the contents of a function execute itself at runtime.

1.(function(){ /*Your actions here*/ })();

This is a very common method of defining complex classes and libraries, that can have their own variables or methods that aren't otherwise available to the object model outside this closure. When you utilize "this" within the function's closure it will be default to the global object, which in the Browser DOM is "window".

1.(function(){
2.this.test = "Test Value";
3.})();
4.alert(test); //alerts "Test Value"

Usually when creating libraries in JavaScript it's a good idea to create namespaces for your library. Below I am going to use a classic example for defining a namespace of My.Namespace. There are helper methods out there that will walk a chain from a literal string of "My.Namespace", but I'm showing it in raw script.

1.if (typeof My == 'undefined')
2.My = {};
3.if (typeof My.Namespace == 'undefined')
4.My.Namespace = {};

By combining the above method, and using the Function.prototype.call method on your anonymous function, you can call the function with "this" set to your namespace. I'll be implementing a class called "SomeClass" within "My.Namespace" below. I'll also be showing how to create private static members and methods, allong with public static methods, and instance methods.

01.//begin private closure
02.(function(){
03. 
04.//this is a private static member that is only available in this closure
05.var instances = 0;
06. 
07.//this is a private static method that can be used internally
08.function _incrementInstances() {
09.instances++;
10.}
11. 
12.//Define SomeClass (js uses functions as class constructors, utilized with the "new" keyword)
13.this.SomeClass = function(options) {
14.//if the function is called directly, return an instance of SomeClass
15.if (!(this instanceOf SomeClass))
16.return new SomeClass(options);
17. 
18.//call static method
19._doSomething();
20. 
21.//handle the options initialization here
22.}
23. 
24.//create a public static method for SomeClass
25.this.SomeClass.getInstanceCount = function() {
26.return instances; //returns the private static member value
27.}
28. 
29.//create an instance method for SomeClass
30.this.SomeClass.prototype.doSomething = function() {
31./*Do Something Here*/
32.}
33. 
34.//end private closure then run the closure, localized to My.Namespace
35.}).call(My.Namespace);

The above is an example of best practices for defining a Class within a given namespace. From here, you can instantiate an instance of "My.NameSpace.SomeClass" and utilize the public methods exposed.

01.//instantiate a SomeClass instance
02.var sc = new My.Namespace.SomeClass({/* options go here */});
03. 
04.//call SomeClass as a function, which will return an instance
05.//  defined above via "(!(this instanceOf SomeClass))"
06.var sc = My.Namespace.SomeClass({/* options */});
07. 
08.//view the instance count, which uses a public static method
09.//  to return a private static member.
10.alert(My.Namespace.SomeClass.getInstanceCoun());

From here, you may be thinking to yourself, that's a lot of typing. This is where aliasing can come in handy, in this example inside a closure of course.

01.(function(){
02.//alias My.NameSpace
03.var m = My.NameSpace
04. 
05.//bad form assigning onload internally,
06.//  but that'll be for another post on event binding
07.//  Also, we could use "this.onload" but using window directly is more obvious here.
08.window.onload = function() {
09.//attach an instance of My.NameSpace.SomeClass instance to window.
10.window.sc = new m.SomeClass({}); //no long namespace name here :)
11.}
12. 
13.})();

Hopefully this post will be helpful in utilizing some privacy with your classes, and using namespaces to prevent naming collisions with other classes, and libraries.

javascript 私有方法的实现的更多相关文章

  1. JavaScript 类私有方法的实现

    一:将私有方法移出模块,因为模块内部的所有方法都是对外可见的. class Widget { foo (baz) { bar.call(this, baz); } // ... } function ...

  2. JavaScript中子类调用父类方法的实现

    一.前言 最近在项目中,前端框架使用JavaScript面向对象编程,遇到了诸多问题,其中最典型的问题就是子类调用父类(super class)同名方法,也就是如C#中子类中调用父类函数base.** ...

  3. JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--实现

    先学习下new操作符吧 new关键字调用函数的心路历程: 1.创建一个新对象 2.将函数的作用域赋给新对象(this就指向这个对象) 3.执行函数中的代码 4.返回这个对象 根据这个的思路,来实现一个 ...

  4. Atitit paip.对象方法的实现原理与本质.txt

    Atitit paip.对象方法的实现原理与本质.txt 对象方法是如何实现的1 数组,对象,字典1 对象方法是如何实现的 这显然是一个对象方法调用.但对象方法是如何实现的呢?在静态语言中,因为有编译 ...

  5. OC:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理

    代码: // // main.m #import <Foundation/Foundation.h> #import "Person.h" #import " ...

  6. 基于原生JS的jsonp方法的实现

    基于原生JS的jsonp方法的实现 jsonp,相信大家并不陌生,是在js异步请求中解决跨域的方法之一,原理很简单,有不清楚的同学可以google下,这里就补详细解释了.在Jquery库中,jQuer ...

  7. 关于Java中hashCode方法的实现源码

    首先来看一下String中hashCode方法的实现源码. public int hashCode() { int h = hash; if (h == 0 && value.leng ...

  8. js中的bind方法的实现方法

    js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind. var obj = { color: 'green' } function demo () { c ...

  9. Salesforce LWC学习(十五) Async 以及 Picklist 公用方法的实现

    本篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) https://developer.salesfo ...

随机推荐

  1. SQL 使用存储过程创建报表的一点体会

    以前创建报表的时候都是采用视图的方式来实现的,通过把关联的表字段选取后形成需要的报表,用起来也比较方便. 最近也尝试用存储过程来做一些开发,确实也方便不少,因为很多逻辑关系都可以灵活的在SQL来实现, ...

  2. Introduction to OOC Programming Language

    Introduction to OOC Programming Language 文/akisann @ cnblogs.com / zhaihj @ github.com 本文同时发布在github ...

  3. PHP5.3 里面数组的的实现方式

    typedef struct _Bucket { char *key; void *value; struct _Bucket *next; } Bucket; typedef struct _Has ...

  4. ERROR 1130: Host xxx is not allowed to connect to this MySQL server

    在使用MySQL-Front连接mysql的时候发生的这个错误 ERROR 1130: Host xxx is not allowed to connect to this MySQL server ...

  5. solrcloud集群部署

    Zookeeper安装 Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成集群模式. 下面将分别进行介绍. 注意防火墙和selinux,关闭后进行如下配置,由于是Java写 ...

  6. 微软必应借PK谷歌突围中国搜索市场

    Bing“必应”是微软2009年推出的搜索品牌(http://www.bing.com),它取代的是同门师兄Live Search.进入2013年,在国内及好莱坞的多部大片里面,我都看到了Bing搜索 ...

  7. PHP语言基础03 By ACReaper

    03.01逻辑运算符 &&,and ||,or xor 这里只强调一点用and或者or的话,记得加上括号,不然可能出错,至于原因我也不是很清楚,反正尽量直接用&&,|| ...

  8. CSS实现导航条Tab的三种方法

    前面的话   导航条Tab在页面中非常常见,本文说详细介绍CSS实现导航条Tab的三种方法 布局   根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...

  9. js动画(一)

    终于放寒假了,哈哈哈,然后,也不准备闲着吧,就是再熟悉一下旧的东西,然后把新的东西也拿来分享一下,自己也准备好了再这个寒假 好好的提高一下自己,哎,菜鸟一枚,真正去实战了,发现自己手上的武器太少了,所 ...

  10. 使用LR11录制手机脚本

    要使用Loadrunner11录制手机脚本,需要先搭建好测试环境:  能够正常使用的LoadRunner11:  安装一个LR11的补丁包,用于手机录制:  pc端和手机端的网络在同一个网段.  ...