js在线编辑网站:http://jsfiddle.net/
Private Members in JavaScript
http://javascript.crockford.com/private.html
JavaScript每个函数都带有一个仅在这个函数范围作用的变量arguments
function sendMessage(msg,obj){ if(arguments.length==2) { obj.handleMsg(Msg); } else {alert(Msg);} }
JavaScript对象都带有一个属性,称为构造函数(constructor)
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量
function f1(){ n=999; } f1(); alert(n); // 999
链式作用域"结构(chain scope)
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
function f1(){ var n=999; function f2(){ alert(n); // 999 } }
闭包的用途
闭包可以用在许多地方。它的最大用处有两个:
一个是前面提到的可以读取函数内部的变量
另一个就是让这些变量的值始终保持在内存中。
function f1(){ var n=999; nAdd=function(){n+=1;}; function f2() { alert(n); } return f2; }; var result=f1(); result(); // 999 nAdd(); result()//1000;
result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
Closures
https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Closures
This scope
function User(name){ this.name= name; } var me = new User("My name"); alert(me.name=="My name"); alert(me.constructor==User); User("Test"); alert(window.name=="Test");
因为this上下文对象没有设定,所以默认为全局的window对象,也就是说windows.name等于提供的这个名字
prototype属性
通过prototype对对象进行方法的添加
简单的构造方法,和简单的原型对象
function User(name,age){ this.name = name; this.age =age; } User.prototype.getname = function(){return this.name;}; User.prototype.getage = function(){return this.age;}; var user = new User("Name","24"); alert(user.getname()=="Name"); alert(user.getage()=="24");
Private method and Privileged
function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var that = this; }
Because dec() is private method,you can not use
var container1 = new Container(3); container1 .dec()
A privileged method is able to access the private variables and methods, and is itself accessible to the public methods and the outside. It is possible to delete or replace a privileged method, but it is not possible to alter it, or to force it to give up its secrets.
Privileged methods are assigned with this within the constructor.
function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var that = this; this.service = function () { if (dec()) { return that.member; } else { return null; } }; }
动态的生成方法:
function User(properties) { (function(which) { for(var i in properties){ var p =i; which["get"+p] = function(){ return properties[p]; }; which["set"+p] = function(val){ properties[p]= val; }; } } )(this); } var user = new User({ name :"Bob", age:"44" }); alert(user.name==null); alert(user.getname()=="Bob"); user.setage(22); alert(user.getage()=="22");