2009年12月3日

手工删除sqlserver中的临时表

if  OBJECT_ID('tempdb..##tmp_CUSTOMERSERMST') is not null

  drop table ..##tmp_CUSTOMERSERMST

 

ps: 临时表名前的 ‘tempdb..’是关键。。。。。。。。。。。。。。

 

posted @ 2009-12-03 10:14 Johnny.3 阅读(45) 评论(0) 编辑

2009年3月7日

学习微软编程工具的方法

学习MSDN+网上的技巧性文章,然后应用到实际中。足够了

posted @ 2009-03-07 11:24 Johnny.3 阅读(53) 评论(0) 编辑

2009年2月25日

delphi中exit,abort,break,continue 的区别

 
 
exit: 退出函数体
abort: 遇到异常,安静处理,就是不显示不提示
break: 退出当前循环体,包括for ,while, repeat等循环体
continue: 结束循环内的本次处理,继续从循环体的开始位置继续执行

posted @ 2009-02-25 08:28 Johnny.3 阅读(2381) 评论(1) 编辑

2009年2月21日

【转】中小IT企业如何留住80后技术人才

 

  对于任何一家IT公司来说,技术人才都是企业的核心宝贵资产。相对于大型外企而言,中小IT企业在企业文化、管理体系、发展培训以及薪资待遇等各方面,都没有优势来引进成熟的技术人才。而在80后一代程序员中成长并涌现出来的技术人才,成为很多中小企业争相抢夺的香饽饽。然而,这些80后的技术人员,在思想和观念上都比较前卫,他们往往兴趣广泛、喜欢新的技术和挑战,而且大都以自我为中心、崇尚自由,稍有不如意就很容易炒老板鱿鱼。因此,如何引进并留住这些年轻的技术骨干,成为困挠国内众多中小IT企业管理者的主要问题。

    Z是国内一家中型IT企业的老总,他所经-营的公司主要做电子政务以及企业协同商务应用系统的产品开发。公司发展十余年,已经拥有较多的国内外大客户,公司业绩发展也较为平稳。然而,研发部门的两位80后核心技术人员M和D的相继离职,让Z陷入了如何培养和留住企业技术骨干的沉思之中。

    “为技术人才提供一个更好的发展平台,这是我们今后需要更多考虑的问题。”Z坦言道。

    M和D来公司的时候,还是刚毕业的学生,但两者在技术上都是一把好手,这也是公司当初看中他们的主要因素。在后来的工作中,他们确实也证明了自己在技术上的能力。M主要负责公司门户产品的架构,并经常引入新的前端技术,D则主要负责工作流方面的改进以及全文检索。他们俩经常会在公司或部门内部开展一些较新的技术话题让大家一起来讨论。

    然而,也正是这种对技术的热爱和不断追求,促使他们去寻求更高的发展平台。M和D对一些新的技术都较为敏感,也希望能把这些新技术引入到公司的产品中,就他们而言,会更多地从技术成长的角度来考虑问题。而对于公司来说,决定是否将一项新的技术投入到产品,期间是需要经过一段时间的。

    “现在看来,我们在技术和产品的结合上走了一段弯路。”Z告诉记者说,“以前,我们允许和鼓励员工搞技术研究,但实际上真正要把技术投入使用到产品上需要很长一段时间。除了要考虑技术本身以及市场等因素外,对于中小企业来说,还需要考虑一个人力成本的问题,例如在某个产品上采用新技术,前期的很多编码工作可能都需要推倒重来,这就需要企业投入更多的人力和物力。”

    但是,要瞄准长远发展,企业不能没有技术上的创新。Z显然也已綷-意识到这一点,并开始尝试在公司内部做一些改进。例如,在前沿技术这一块,针对技术人员提出的新想法,公司会从技术、市场以及决策几个方面来尽快决定是否将这项新技术投入产品,或者只是继续作为一项技术进行跟踪。

    除了加快技术和产品的结合之外,Z还尝试在公司管理层面上进行一些改进,希望以此来吸引并留住技术人才。例如,在职业发展上,考虑到年轻员工的兴趣点容易发生变化,公司允许内部轮岗,为他们提供不同的发展空间。在培训机制方面,由以前主要的内部开展培训变为“内外”结合,员工不仅能走出去接受培训,公司也会从外面邀请专家来做培训。在奖励机制上,除了年底奖金之外,对于核心技术人员,公司还考虑让他们参与期权,甚至公司的股权。Z坦言,让员工参与股权这样的事情,几年前在公司里都是不可能的。

    Z所做的尝试和改进,反映了大多数中小企业管理者想留住人才的愿望。但是,80后一代的技术人员他们自己是如何想的呢?通过对身边一些的80后技术人员的了解,大致可以看出他们对于职业选择的考虑不外乎是这样几点:

    首先,最重要的一点是工作环境和发展平台。对于80后这一代程序员来说,对于工作的选择更多考虑的不是薪资,而是企业的工作环境和所提供的平台是否对个人的职业发展有利。根据美国行为科学家弗雷德里克赫茨伯格提出的激励因素——保健因素理论,能满足个人自我实现需要的因素如挑战性的工作、个人成长和发展的机会等,是使得人们更好地工作的主要激励因素。L是记者认识的一位80后的朋友,现在已经做到了国内一家知名网站的技术总监。在他看来,80后一代的IT人想法很简单:喜欢就很喜欢,不喜欢就很不喜欢。只要薪水不算太低,能学到更多东西,这便足以形成一家公司吸引他们的最根本原因。H也是一位80后一代的程序员,在受雇于现在的雇主——国外某著名IT咨询公司——之前,他也曾经在国内一家小型IT企业工作过3年。他向记者坦言,工作环境和发展平台是他考虑选择去外企的主要原因。由于外企多是全球范围的衆-作,很多内部的文档和资料都是通过某种途径共享。大量的资料对于技术人员来说不吝是一个宝库,这不仅能够让乐于学习新技术的他们如鱼得水,还能让他们开阔眼界,学到甚至参与到国外最新的领域。

    其次,薪资待遇。除了能提供良好的工作环境和发展平台之外,新酬福利也是吸引技术人员眼球的重要因素。对于技术人员来说,薪资不仅是个人价值的体现,更是反映公司对他们的认同程度。相比财大气粗的大型外企,大多数中小企业无法提供有竞争力的薪资,但还是可以通过其他的手段来留住人才,如前文中Z所提到的,允许核心技术人员参与公司的期权和股权。

    最后,人文关怀。这一点看似无足轻重,但却能从细节上体现出一个公司是否真正为它的员工着想。例如,在作息管理上,很多国外公司普遍采取比较灵活的作息时间制度,多数要求工作够8小时而不需要打卡,甚至在有的公司工作时间也可随员工个人意愿调整。现在国内IT公司也在随形势而变采取这样的人性化管理制度,但还是有不少企业要求员工上下班打卡,如果迟到就克扣奖金或工资,而对于加班则没有任何补偿。另外,在一些生活细节处的人性化关怀,也是企业吸引技术员工的有效做法,例如为员工提供免费的饮料和食品,在办公家具和电脑硬件设施上给员工提供较为舒适的工作条件。这些看似简单的福利,却往往能让技术人员从内心深处感受到公司对他们的重视。

    了解和掌握80后一代的职场观,并采取有效措施来调整和适应他们,将会是很多企业需要面临的问题,因为在今后的十到二十年内,主要的劳动力资源都将依靠这一代人。实际上,一些知名外企的人力资源都已经开始意识到这个问题,并针对80后这一代人的特点,在工作方式上做出了许多调整,包括在家办公计划等。当然,中小企业要照搬一套大型外企的管理模式是不切实际的,但本着留住优秀技术人才的愿望,采取一些改进的措施是非常必要的。

    说起80后,听到最多的一句是:“这些孩子啊。。。唉”。一声叹息的背后,有对他们的赞扬,也饱含着一种无奈。其实,就如同“没有教不好的孩子,只有不称职的父母”这个新式的教育信条一样,在叹息之前,或者说在指责之前,首先应该更多的从自身找一下原因。很高兴地看到,国内的IT企业经理人在这方面开始深入的思考和反思。我想这会对IT行业的持续发展起到极大的促进作用。

    其实何止是80后的技术人员喜欢“追新”,天下的技术人才大都属于这一行列。追新没有什么不好,但是作为一个企业,IT公司当然要对技术风险进行有效评估了。在一种谨慎的态度下做出来的结论,或许会被喜欢追新的人认为是“守旧”。出现这样的问题时,我个人认为坦承的沟通是非常重要的,如果是一个中小型的IT公司,更是不应该出现那种“高高在上”领导者的角色。由两个平等的人进行换位思考:“假设你是公司的綷-理人,在公司的目前的盈利状况下,在我们对这个新技术的评估结论下,我们是否敢冒然采用?请给出你足够的理由”。当然,在条件允许的情况下,一定要创造机会让这些有闯劲的年轻人去尝试创新,过分的压制或者保守,容易导致极度的失望,长此以往,离职是早晚的事情。利用业余时间的“兴趣小组”可能是解决此矛盾的一种最佳实践:通过制定明确的项目目标和验收标准(而不是“玩具类”的项目),对新的技术进行评估,既可以让技术人员去努力尝鲜并增加技术储备,又降低了企业的技术风险。

    另外,企业不要夸大了“提高薪资”的作用,我个人认为薪资不是留住80后的主要因素,他们需要的是别人对自己价值的认可,以及对滋生能力提升的认知。在我接触到的很多管理者的意识中,很多人认为:我已经给了他足够的承认,也尽可能多给了他工资,他还有什么不满意的呢?80后的年轻人,其实尤其关注自己的成长需要。往往在他提出要离职时,已经覆水难收,想用再多的银子也无法挽留他了。

    最后不得不说到一个普遍点的IT现象,就是“加班”,特别在生存环境压力比较大的中小型IT企业中,这种情况更甚。常常听到的抱怨是“只见加班,不见加班费,甚至有时还因为迟到扣钱”。弹性的工作制度和奖惩措施都是必要的,如果有必要的人文关怀,就会让员工更加努力的工作。要知道,称职的程序员是“不必扬鞭自奋蹄”的。“80后”其实是一种更加需要关怀的年龄,排解他们的压力和担忧,和他们成为知心的朋友,只有心和心的平等沟通,才会换来一个大家双赢的结果。◎ 文/朱海燕

posted @ 2009-02-21 09:25 Johnny.3 阅读(37) 评论(0) 编辑

2009年2月20日

-------------------该文摘自于匿名教程总结,希望对初学js的同学有帮助,因为它解决了我学习js的众多迷惑。。。

-------------------该文摘自于匿名教程总结,希望对初学js的同学有帮助,因为它解决了我学习js的众多迷惑。。。


函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解。

  javascript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的。通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递。在继续讲述之前,先看一下函数的使用语法:

以下是引用片段:
function func1(…){…}
var func2=function(…){…};
var func3=function func4(…){…};
var func5=new Function(); 


  这些都是声明函数的正确语法。它们和其他语言中常见的函数或之前介绍的函数定义方式有着很大的区别。那么在JavaScript中为什么能这么写?它所遵循的语法是什么呢?下面将介绍这些内容。


  认识函数对象(Function Object)

  可以用function关键字定义一个函数,并为每个函数指定一个函数名,通过函数名来进行调用。在JavaScript解释执行时,函数都是被维护为一个对象,这就是要介绍的函数对象(Function Object)。

  函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象,例如日期对象(Date)、数组对象(Array)、字符串对象(String)都属于内部对象。这些内置对象的构造器是由JavaScript本身所定义的:通过执行new Array()这样的语句返回一个对象,JavaScript内部有一套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。

  在JavaScript中,函数对象对应的类型是Function,正如数组对象对应的类型是Array,日期对象对应的类型是Date一样,可以通过new Function()来创建一个函数对象,也可以通过function关键字来创建一个对象。为了便于理解,我们比较函数对象的创建和数组对象的创建。先看数组对象:下面两行代码都是创建一个数组对象myArray:

以下是引用片段:
var myArray=[];
//等价于
var myArray=new Array();
同样,下面的两段代码也都是创建一个函数myFunction:
function myFunction(a,b){
      return a+b;
}
//等价于
var myFunction=new Function("a","b","return a+b"); 


  通过和构造数组对象语句的比较,可以清楚的看到函数对象本质,前面介绍的函数声明是上述代码的第一种方式,而在解释器内部,当遇到这种语法时,就会自动构造一个Function对象,将函数作为一个内部的对象来存储和运行。从这里也可以看到,一个函数对象名称(函数变量)和一个普通变量名称具有同样的规范,都可以通过变量名来引用这个变量,但是函数变量名后面可以跟上括号和参数列表来进行函数调用。

  用new Function()的形式来创建一个函数不常见,因为一个函数体通常会有多条语句,如果将它们以一个字符串的形式作为参数传递,代码的可读性差。下面介绍一下其使用语法:

以下是引用片段:
var funcName=new Function(p1,p2,...,pn,body);

      参数的类型都是字符串,p1到pn表示所创建函数的参数名称列表,body表示所创建函数的函数体语句,funcName就是所创建函数的名称。可以不指定任何参数创建一个空函数,不指定funcName创建一个无名函数,当然那样的函数没有任何意义。

  需要注意的是,p1到pn是参数名称的列表,即p1不仅能代表一个参数,它也可以是一个逗号隔开的参数列表,例如下面的定义是等价的:

以下是引用片段:
new  Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")

  JavaScript引入Function类型并提供new Function()这样的语法是因为函数对象添加属性和方法就必须借助于Function这个类型。

  函数的本质是一个内部对象,由JavaScript解释器决定其运行方式。通过上述代码创建的函数,在程序中可以使用函数名进行调用。本节开头列出的函数定义问题也得到了解释。注意可直接在函数声明后面加上括号就表示创建完成后立即进行函数调用,例如:

以下是引用片段:
var i=function (a,b){
      return a+b;
}(1,2);
alert(i); 


  这段代码会显示变量i的值等于3。i是表示返回的值,而不是创建的函数,因为括号“(”比等号“=”有更高的优先级。这样的代码可能并不常用,但当用户想在很长的代码段中进行模块化设计或者想避免命名冲突,这是一个不错的解决办法。


  需要注意的是,尽管下面两种创建函数的方法是等价的:

以下是引用片段:
function funcName(){
      //函数体
}
//等价于
var funcName=function(){
      //函数体


  但前面一种方式创建的是有名函数,而后面是创建了一个无名函数,只是让一个变量指向了这个无名函数。在使用上仅有一点区别,就是:对于有名函数,它可以出现在调用之后再定义;而对于无名函数,它必须是在调用之前就已经定义。例如:

以下是引用片段:
<script language="JavaScript" type="text/javascript">
<!--
func();
var func=function(){
      alert(1)
}
//-->
</script> 

  这段语句将产生func未定义的错误,而:

以下是引用片段:
<script language="JavaScript" type="text/javascript">
<!--
func();
function func(){
      alert(1)
}
//-->
</script> 

  则能够正确执行,下面的语句也能正确执行:

以下是引用片段:
<script language="JavaScript" type="text/javascript">
<!--
func();
var someFunc=function func(){
      alert(1)
}
//-->
</script> 

  由此可见,尽管JavaScript是一门解释型的语言,但它会在函数调用时,检查整个代码中是否存在相应的函数定义,这个函数名只有是通过function funcName()形式定义的才会有效,而不能是匿名函数。


  函数对象和其他内部对象的关系


  除了函数对象,还有很多内部对象,比如:Object、Array、Date、RegExp、Math、Error。这些名称实际上表示一个类型,可以通过new操作符返回一个对象。然而函数对象和其他对象不同,当用typeof得到一个函数对象的类型时,它仍然会返回字符串“function”,而typeof一个数组对象或其他的对象时,它会返回字符串“object”。下面的代码示例了typeof不同类型的情况:

以下是引用片段:
alert(typeof(Function)));
alert(typeof(new Function()));
alert(typeof(Array));
alert(typeof(Object));
alert(typeof(new Array()));
alert(typeof(new Date()));
alert(typeof(new Object())); 


  运行这段代码可以发现:前面4条语句都会显示“function”,而后面3条语句则显示“object”,可见new一个function实际上是返回一个函数。这与其他的对象有很大的不同。其他的类型Array、Object等都会通过new操作符返回一个普通对象。尽管函数本身也是一个对象,但它与普通的对象还是有区别的,因为它同时也是对象构造器,也就是说,可以new一个函数来返回一个对象,这在前面已经介绍。所有typeof返回“function”的对象都是函数对象。也称这样的对象为构造器(constructor),因而,所有的构造器都是对象,但不是所有的对象都是构造器。

  既然函数本身也是一个对象,它们的类型是function,联想到C++、Java等面向对象语言的类定义,可以猜测到Function类型的作用所在,那就是可以给函数对象本身定义一些方法和属性,借助于函数的prototype对象,可以很方便地修改和扩充Function类型的定义,例如下面扩展了函数类型Function,为其增加了method1方法,作用是弹出对话框显示"function":

以下是引用片段:
Function.prototype.method1=function(){
      alert("function");
}
function func1(a,b,c){
      return a+b+c;
}
func1.method1();
func1.method1.method1(); 


  注意最后一个语句:func1.method1.mehotd1(),它调用了method1这个函数对象的method1方法。虽然看上去有点容易混淆,但仔细观察一下语法还是很明确的:这是一个递归的定义。因为method1本身也是一个函数,所以它同样具有函数对象的属性和方法,所有对Function类型的方法扩充都具有这样的递归性质。

  Function是所有函数对象的基础,而Object则是所有对象(包括函数对象)的基础。在JavaScript中,任何一个对象都是Object的实例,因此,可以修改Object这个类型来让所有的对象具有一些通用的属性和方法,修改Object类型是通过prototype来完成的:

以下是引用片段:
Object.prototype.getType=function(){
      return typeof(this);
}
var array1=new Array();
function func1(a,b){
      return a+b;
}
alert(array1.getType());
alert(func1.getType()); 


  上面的代码为所有的对象添加了getType方法,作用是返回该对象的类型。两条alert语句分别会显示“object”和“function”。


      将函数作为参数传递

  在前面已经介绍了函数对象本质,每个函数都被表示为一个特殊的对象,可以方便的将其赋值给一个变量,再通过这个变量名进行函数调用。作为一个变量,它可以以参数的形式传递给另一个函数,这在前面介绍JavaScript事件处理机制中已经看到过这样的用法,例如下面的程序将func1作为参数传递给func2:

以下是引用片段:
function func1(theFunc){
      theFunc();
}
function func2(){
      alert("ok");
}
func1(func2); 

  在最后一条语句中,func2作为一个对象传递给了func1的形参theFunc,再由func1内部进行theFunc的调用。事实上,将函数作为参数传递,或者是将函数赋值给其他变量是所有事件机制的基础。


  例如,如果需要在页面载入时进行一些初始化工作,可以先定义一个init的初始化函数,再通过window.onload=init;语句将其绑定到页面载入完成的事件。这里的init就是一个函数对象,它可以加入window的onload事件列表。


  传递给函数的隐含参数:arguments

  当进行函数调用时,除了指定的参数外,还创建一个隐含的对象——arguments。arguments是一个类似数组但不是数组的对象,说它类似是因为它具有数组一样的访问性质,可以用arguments[index]这样的语法取值,拥有数组长度属性length。arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,例如:

以下是引用片段:
function func(a,b){
    alert(a);
    alert(b);
    for(var i=0;i<arguments.length;i++){
          alert(arguments[i]);
    }
}
func(1,2,3); 

  代码运行时会依次显示:1,2,1,2,3。因此,在定义函数的时候,即使不指定参数列表,仍然可以通过arguments引用到所获得的参数,这给编程带来了很大的灵活性。arguments对象的另一个属性是callee,它表示对函数对象本身的引用,这有利于实现无名函数的递归或者保证函数的封装性,例如使用递归来计算1到n的自然数之和:

以下是引用片段:
var sum=function(n){
      if(1==n)return 1;
      else return n+sum(n-1);
}
alert(sum(100)); 


  其中函数内部包含了对sum自身的调用,然而对于JavaScript来说,函数名仅仅是一个变量名,在函数内部调用sum即相当于调用一个全局变量,不能很好的体现出是调用自身,所以使用arguments.callee属性会是一个较好的办法:

以下是引用片段:
var sum=function(n){
      if(1==n)return 1;
      else return n+arguments.callee(n-1);
}
alert(sum(100)); 


  callee属性并不是arguments不同于数组对象的惟一特征,下面的代码说明了arguments不是由Array类型创建:

以下是引用片段:
Array.prototype.p1=1;
alert(new Array().p1);
function func(){
      alert(arguments.p1);
}
func();

  运行代码可以发现,第一个alert语句显示为1,即表示数组对象拥有属性p1,而func调用则显示为“undefined”,即p1不是arguments的属性,由此可见,arguments并不是一个数组对象。

  函数的apply、call方法和length属性

  JavaScript为函数对象定义了两个方法:apply和call,它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别:

以下是引用片段:
Function.prototype.apply(thisArg,argArray);
Function.prototype.call(thisArg[,arg1[,arg2…]]); 


  从函数原型可以看到,第一个参数都被取名为thisArg,即所有函数内部的this指针都会被赋值为thisArg,这就实现了将函数作为另外一个对象的方法运行的目的。两个方法除了thisArg参数,都是为Function对象传递的参数。下面的代码说明了apply和call方法的工作方式:

以下是引用片段:
//定义一个函数func1,具有属性p和方法A
function func1(){
      this.p="func1-";
      this.A=function(arg){
            alert(this.p+arg);
      }
}
//定义一个函数func2,具有属性p和方法B
function func2(){
      this.p="func2-";
      this.B=function(arg){
            alert(this.p+arg);
      }
}
var obj1=new func1();
var obj2=new func2();
obj1.A("byA");    //显示func1-byA
obj2.B("byB");    //显示func2-byB
obj1.A.apply(obj2,["byA"]); //显示func2-byA,其中[“byA”]是仅有一个元素的数组,下同
obj2.B.apply(obj1,["byB"]); //显示func1-byB
obj1.A.call(obj2,"byA");  //显示func2-byA
obj2.B.call(obj1,"byB");  //显示func1-byB 

  可以看出,obj1的方法A被绑定到obj2运行后,整个函数A的运行环境就转移到了obj2,即this指针指向了obj2。同样obj2的函数B也可以绑定到obj1对象去运行。代码的最后4行显示了apply和call函数参数形式的区别。


  与arguments的length属性不同,函数对象还有一个属性length,它表示函数定义时所指定参数的个数,而非调用时实际传递的参数个数。例如下面的代码将显示2:

以下是引用片段:
function sum(a,b){
      return a+b;
}
alert(sum.length); 

深入认识JavaScript中的this指针


  this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。

  和其他面向对象的语言不同,JavaScript中的this指针是一个动态的变量,一个方法内的this指针并不是始终指向定义该方法的对象的,在上一节讲函数的apply和call方法时已经有过这样的例子。为了方便理解,再来看下面的例子:

以下是引用片段:
<script language="JavaScript" type="text/javascript">
<!--
//创建两个空对象
var obj1=new Object();
var obj2=new Object();
//给两个对象都添加属性p,并分别等于1和2
obj1.p=1;
obj2.p=2;
//给obj1添加方法,用于显示p的值
obj1.getP=function(){
      alert(this.p); //表面上this指针指向的是obj1
}
//调用obj1的getP方法
obj1.getP();
//使obj2的getP方法等于obj1的getP方法
obj2.getP=obj1.getP;
//调用obj2的getP方法
obj2.getP();
//-->
</script> 

  从代码的执行结果看,分别弹出对话框显示1和2。由此可见,getP函数仅定义了一次,在不同的场合运行,显示了不同的运行结果,这是有this指针的变化所决定的。在obj1的getP方法中,this就指向了obj1对象,而在obj2的getP方法中,this就指向了obj2对象,并通过this指针引用到了两个对象都具有的属性p。

  由此可见,JavaScript中的this指针是一个动态变化的变量,它表明了当前运行该函数的对象。由this指针的性质,也可以更好的理解JavaScript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。实际上,前面介绍的apply方法和call方法都是通过强制改变this指针的值来实现的,使this指针指向参数所指定的对象,从而达到将一个对象的方法作为另一个对象的方法运行。

  每个对象集合的元素(即属性或方法)也是一个独立的部分,全局函数和作为一个对象方法定义的函数之间没有任何区别,因为可以把全局函数和变量看作为window对象的方法和属性。也可以使用new操作符来操作一个对象的方法来返回一个对象,这样一个对象的方法也就可以定义为类的形式,其中的this指针则会指向新创建的对象。在后面可以看到,这时对象名可以起到一个命名空间的作用,这是使用JavaScript进行面向对象程序设计的一个技巧。例如:

以下是引用片段:
var namespace1=new Object();
namespace1.class1=function(){
    //初始化对象的代码
}
var obj1=new namespace1.class1(); 


  这里就可以把namespace1看成一个命名空间。

  由于对象属性(方法)的动态变化特性,一个对象的两个属性(方法)之间的互相引用,必须要通过this指针,而其他语言中,this关键字是可以省略的。如上面的例子中:

以下是引用片段:
obj1.getP=function(){
      alert(this.p); //表面上this指针指向的是obj1

}
这里的 this 关键字是不可省略的,即不能写成 alert(p)的形式。这将使得 getP 函数去引
用上下文环境中的 p 变量,而不是 obj1 的属性。

posted @ 2009-02-20 21:45 Johnny.3 阅读(183) 评论(0) 编辑

SQl中的左连接,右连接,内连接,全连接,自连接的理解。

    按照自己的理解做个笔记,以下在Sql Server2005和Oracle92中都运行通过:

create table a(
   aid varchar(2),
   aname varchar(10),
   bid varchar(2) );

create table b(
   bid varchar(2),
   bname varchar(10));


insert into a values('s1','sname1','c1');
insert into a values('s2','sname2','c2');
insert into a values('s3','sname3','c3');
insert into a values('s4','sname4','c4');
insert into a values('s5','sname5','c5');

insert into b values('c1','cname1');
insert into b values('c2','cname2');
insert into b values('c3','cname3');
insert into b values('c6','cname6');
insert into b values('c7','cname7');

--Iner Join和Join和, (如select * from a,b where a.id=b.id),这三个效果一样.

select * from  a ,  b where  a.bid = b.bid;
select * from a join b on a.bid = b.bid;
select * from a inner join b on a.bid = b.bid;

 

 

 

--Left Join和Left Outer Join 左连接、左外连接,效果一样。
select * from a left join b on a.bid = b.bid;
select * from a left outer join b on a.bid = b.bid;

 

 

 

 

 

--Right Join和Right Outer Join 右连接、右外连接,效果一样。

select * from a right join b on a.bid = b.bid;
select * from a right outer join b on a.bid = b.bid;

 

 

 

 

 

 

--Full Join和Full Outer Join 全连接、全外连接,效果一样。

select * from a full join b on a.bid = b.bid;
select * from  a full outer join  b on a.bid = b.bid;

 

 

 

 

--Cross Join,不带where,即笛卡尔积。

select * from a  Cross join b;

 

 

 

 

总结:只有以上的的连接词,像什么Left Inner Join、Right Full Join之类的组合都没有,想都别想!! 

posted @ 2009-02-20 11:04 Johnny.3 阅读(945) 评论(1) 编辑

导航

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

公告

昵称:Johnny.3
园龄:2年11个月
粉丝:0
关注:0

搜索

 
 

常用链接

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜