0 0

一个JAVASCRIPT面向对象编程的问题5

function User(properties){
for(var p in properties){(function(which){
    var i = p;
    which("get" + i)=function(){
return properties[p];
      };
    which("set" + i)=function(val){
    properties[p] = val;
    };
  })(this);
}
}
哪位高手可以分析下这段代码,特别是var i = p;为什么必须要使用这句,还有(function(which){})(this);这个语法的意思是什么?
2008年12月16日 15:52

2个答案 按时间排序 按投票排序

0 0

采纳的答案

这段代码看起来有点问题。Anyway,先从简单的开始讲。

(function(which) { })(this)

的意思就是定义一个匿名函数,并以this作为参数来调用。
注意到JavaScript的函数是不限制调用时提供的实际参数个数的,这里的which只是说如果调用的时候给了一个或多个参数,那么第一个参数叫做which。
这么做主要是为了避免直接使用this。JavaScript里的this的语义跟其它主流的面向对象语言有点不同,所以这种做法也算是JavaScript里相对独特的了。关于this,我以前简单记过一点,http://rednaxelafx.iteye.com/blog/176500

然后,var i = p这句的必要性在于p是定义在User函数里的,其作用域是整个函数的范围;它的值在for循环里会不停改变,而for循环的循环体里面是一个匿名函数,会形成闭包;如果不将其赋值给一个局部变量再使用的话……呵呵,你运行一下问题里的那段代码就知道会怎么样了:代码里有至少两种错误:
1、两个which()都应该是which[](不是圆括号而是方括号);这个不修改连运行都运行不了。
2、两个property[p]都应该是property[i]。
闭包带来的问题在第二种错误里就会表现出来。只要这样调用一下:
var u = new User({x:1, y:2, z:3})
for (var p in u) {
  if (p.match(/^set/)) { // if the member is a setter, call it
    u[p](p.substring(3)) // set the value to its original property name
  }
}
for (var p in u) {
  if (p.match(/^get/)) { // if the member is a getter, call it
    alert(p + ' ' + u[p]())
  }
}

输入的参数是带有x、y、z三个属性的对象,所以应该生成getx/setx、gety/sety、getz/setz,最后看到输出应该是:
getx x
gety y
getz z
而实际执行问题中的代码会看到结果是:
getx z
gety z
getz z
这就说明有问题了。

把问题中的代码中两种错误改过来:
function User(properties) {
  for (var p in properties) {
    (function(which) {
      var i = p;
      which["get" + i] = function() {
        return properties[i];
      };
      which["set" + i] = function(val){
        properties[i] = val;
      };
    })(this);
  }
}

可以看到行为就是期望中的行为了。关于闭包以前我记过C#/Ruby的,在这里:http://rednaxelafx.iteye.com/blog/177604。JavaScript的状况跟C#的有点相似;不同的是虽然User函数里的变量p是在for循环里定义的,但它的作用域是覆盖了整个User函数的范围,而不是限制在for循环内的。这个我也稍微记过一点,这里:http://rednaxelafx.iteye.com/blog/190347

2008年12月16日 16:48
0 0

首先不说你这个代码写的是否正确啊
直说你后面的那个问题

(function(which){
                          var i = p;
                          which("get" + i) = function(){
                              return properties[p];
                          };
                          
                          which("set" + i) = function(val){
                              properties[p] = val
                          };
                      })(this);


就是等价于
var f = function(which){
                          var i = p;
                          which("get" + i) = function(){
                              return properties[p];
                          };
                          
                          which("set" + i) = function(val){
                              properties[p] = val
                          };    
};
f(this);


如果你不理解可以简单点使用下下面的
(function(arg){
     alert(arg);
})("hello, boy");


和这段代码 在EditPlus上试下就知道了
	var f = function f(arg){
		alert(arg)
	}
  
    f("hello, boy");

2008年12月16日 16:32

相关推荐

    Javascript面向对象编程.

    在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...

    JavaScript面向对象编程指南

    资源名称:JavaScript面向对象编程指南内容简介: Javascript是一种具有高度表达能力的、基于原型特性的、非常灵活的面向对象编程语言。《Javascript面向对象编程指南》着重介绍Javascript在面向...

    JavaScript面向对象编程指南.pdf

    JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库

    JavaScript面向对象编程指南(第2版).rar

    JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。

    JavaScript面向对象编程指南 pdf

    下面将详细探讨JavaScript面向对象编程的基本原理、特性以及实际应用。 1. **类与对象** - 在JavaScript中,对象是键值对的集合,可以通过字面量语法或构造函数创建。例如: ```javascript const person = { ...

    JavaScript面向对象编程指南完整版

    JavaScript面向对象编程指南是完整的扫描版...

    JavaScript面向对象编程.pdf

    JavaScript面向对象编程.pdf

    javascript面向对象编程

    面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...

    javascript面向对象编程指南 2nd

    javascript面向对象编程指南 2nd英文版,英文名:Object-Oriented JavaScript。 What you will learn from this book The basics of object-oriented programming, and how to apply it in the JavaScript ...

    JavaScript面向对象编程指南(第2版)

    资源名称:JavaScript面向对象编程指南(第2版)内容简介:1.本书是唯一一本介绍Javascript面向对象编程的图书。2.本书作者是知名的Web开发人员和作者。受到国内众多前端开发人员,如淘宝UED团队的推崇和推荐...

    JavaScript面向对象编程指南 完整版

    JavaScript面向对象编程指南完整版是扫描的....

Global site tag (gtag.js) - Google Analytics