WEB开发网
开发学院网页设计JavaScript js 匿名函数:动态生成方法 阅读

js 匿名函数:动态生成方法

 2009-09-19 00:00:00 来源:WEB开发网   
核心提示:在书上看到一个例子,有点错误,js 匿名函数:动态生成方法,修改了一下,以下是我的理解!书上是这样写的,name属性并不存在,因为它是属性对象(propsObj)的私有变量alert(user.name==null);//输出truealert(user.getname());//输出chengkaiuser.seta

在书上看到一个例子,有点错误。修改了一下。以下是我的理解!

书上是这样写的,我加了些注解:

function User(props){ 
  for(var prop in props){ 
    (function(currentObj){ //这里的currentObj由this传过来的。this 为 User 
      alert(currentObj.constructor); //可以看出来currentObj 为User 
      //创建此属性的一个新的getter(读取器) 
      currentObj["get"+prop] = function(){ 
        //alert(props.name+" "+props.age+" "+prop); 
        return props[prop]; 
      } 
      //创建此属性的一个新的setter(设置器) 
      currentObj["set"+prop] = function(val){ 
        props[prop] = val; 
      }; 
    })(this); //这里的this 为 User 
  } 
} 
 
var user = new User({"name":"chengkai","age":22}); 
 
//注意,name属性并不存在,因为它是属性对象(props Obj)的私有变量 
alert(user.name == null); //输出 true 
 
alert(user.getname()); //输出 22 
alert(user.getage()); //输出 22

如上:为什么会输出都为22这样呢?哈哈。这里就是闭包问题了!!

改正:

//****************动态生成方法********************** 
//props 对象,如:{"name":"chengkai","age":22} 
//************************************************ 
function User(props){ 
  for(var prop in props){ 
    (function(currentObj){ //这里的currentObj由this传过来的。this 为 User 
      //创建此属性的一个新的getter(读取器) 
      (function(prop){ 
      currentObj["get"+prop] = function(){ 
        //alert(props.name+" "+props.age+" "+prop); 
        return props[prop]; 
      } 
      //创建此属性的一个新的setter(设置器) 
      currentObj["set"+prop] = function(val){ 
        props[prop] = val; 
      }; 
      })(prop); 
    })(this); //这里的this 为 User 
  } 
} 
 
var user = new User({"name":"chengkai","age":22}); 
 
//注意,name属性并不存在,因为它是属性对象(props Obj)的私有变量 
alert(user.name == null); //输出 true 
 
alert(user.getname()); //输出 chengkai 
 
user.setage(11); 
user.setname("kai"); 
alert(user.getage()); //输出 11 
alert(user.getname()); //输出 kai

注意前后的区别,理解了上面匿名函数的应用,应该很好看出来是么回事啦!

Tags:js 匿名 函数

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接