javascript 私有方法的实现
原文地址:
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 closure02.(function(){03. 04.//this is a private static member that is only available in this closure05.var instances = 0;06. 07.//this is a private static method that can be used internally08.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 SomeClass15.if (!(this instanceOf SomeClass))16.return new SomeClass(options);17. 18.//call static method19._doSomething();20. 21.//handle the options initialization here22.}23. 24.//create a public static method for SomeClass25.this.SomeClass.getInstanceCount = function() {26.return instances; //returns the private static member value27.}28. 29.//create an instance method for SomeClass30.this.SomeClass.prototype.doSomething = function() {31./*Do Something Here*/32.}33. 34.//end private closure then run the closure, localized to My.Namespace35.}).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 instance02.var sc = new My.Namespace.SomeClass({/* options go here */});03. 04.//call SomeClass as a function, which will return an instance05.// defined above via "(!(this instanceOf SomeClass))"06.var sc = My.Namespace.SomeClass({/* options */});07. 08.//view the instance count, which uses a public static method09.// 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.NameSpace03.var m = My.NameSpace04. 05.//bad form assigning onload internally,06.// but that'll be for another post on event binding07.// 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 私有方法的实现的更多相关文章
- JavaScript 类私有方法的实现
一:将私有方法移出模块,因为模块内部的所有方法都是对外可见的. class Widget { foo (baz) { bar.call(this, baz); } // ... } function ...
- JavaScript中子类调用父类方法的实现
一.前言 最近在项目中,前端框架使用JavaScript面向对象编程,遇到了诸多问题,其中最典型的问题就是子类调用父类(super class)同名方法,也就是如C#中子类中调用父类函数base.** ...
- JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--实现
先学习下new操作符吧 new关键字调用函数的心路历程: 1.创建一个新对象 2.将函数的作用域赋给新对象(this就指向这个对象) 3.执行函数中的代码 4.返回这个对象 根据这个的思路,来实现一个 ...
- Atitit paip.对象方法的实现原理与本质.txt
Atitit paip.对象方法的实现原理与本质.txt 对象方法是如何实现的1 数组,对象,字典1 对象方法是如何实现的 这显然是一个对象方法调用.但对象方法是如何实现的呢?在静态语言中,因为有编译 ...
- OC:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理
代码: // // main.m #import <Foundation/Foundation.h> #import "Person.h" #import " ...
- 基于原生JS的jsonp方法的实现
基于原生JS的jsonp方法的实现 jsonp,相信大家并不陌生,是在js异步请求中解决跨域的方法之一,原理很简单,有不清楚的同学可以google下,这里就补详细解释了.在Jquery库中,jQuer ...
- 关于Java中hashCode方法的实现源码
首先来看一下String中hashCode方法的实现源码. public int hashCode() { int h = hash; if (h == 0 && value.leng ...
- js中的bind方法的实现方法
js中目前我遇见的改变作用域的5中方法:call, apply, eval, with, bind. var obj = { color: 'green' } function demo () { c ...
- Salesforce LWC学习(十五) Async 以及 Picklist 公用方法的实现
本篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) https://developer.salesfo ...
随机推荐
- IOS开发的内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- 关于C++中Object所占内存空间探索1
关于C++中Object所占内存空间探索(一) 有如下问题: 1. 一个空类, class X{ }; 2.类中含有数据成员(Data Member), class X { public: //Fun ...
- phpcms 2008 后台发文章chrome和firefox文章不能上传图片的问题
/web/fckeditor/editor/dialog/fck_image.html /web/fckeditor/editor/dialog/fck_image/fck_image.js 这两个文 ...
- Linq 更改主键值
有一个班级表,主键是class_id,在管理班级时要进行逻辑删除,而只是单纯的is_del字段(记录每条数据是否有效)更改为true,主键class_id如果不变动,在再次增加一个班级时,其主键如果和 ...
- Integer.parseInt(String s, int radix)方法介绍(修正版)
先来说明一下Integer.parseInt(String s, int radix)的功能. Integer.parseInt(String s, int radix)就是将整数字符串s(radix ...
- Standford机器学习 聚类算法(clustering)和非监督学习(unsupervised Learning)
聚类算法是一类非监督学习算法,在有监督学习中,学习的目标是要在两类样本中找出他们的分界,训练数据是给定标签的,要么属于正类要么属于负类.而非监督学习,它的目的是在一个没有标签的数据集中找出这个数据集的 ...
- Data Guard组件等相关介绍
1.Data Guard组件介绍 Data Guard架构归类为3个主要的组件. Data Guard 重做传输服务 重做传输服务用来将主数据库生成的重做数据传输给备用数据库. Data Guar ...
- docker的网络-Container network interface(CNI)与Container network model(CNM)
Overview 目前围绕着docker的网络,目前有两种比较主流的声音,docker主导的Container network model(CNM)和社区主导的Container network in ...
- Android RecyclerView完全解析
RecyclerView完全解析 (一) 前言 话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比Li ...
- jQuery2.x源码解析(DOM操作篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) jQuery这个类库最为核心重要的功能就是DOM ...