1. 依赖注入方式

    DI三种注入方式:  

    2017/02/12 iteye

  2. Javascript 面向对象编程(一):封装

    摘自:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html   Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢? 1. 生成对象的原始模式 假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性。   var Cat = {     name : '',     color : ''   } 现在,我们需要根据这个原型对象,生成两个实例对象。   var cat1 = {};   // 或者 var cat1 = new Object();     cat1.name = "大毛";     cat1.color = "黄色";   var cat2 = {};     cat2.name = "二毛";     cat2.color = "黑色"; 好了,这就是最简单的封装了。但是,这样的写法有两个缺点,一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有任何办法,可以看出有什么联系。 2. 原始模式的改进 我们可以写一个函数,解决代码重复的问题。 //using Literal Notation   function Cat(name,color){     return {       name:name,       color:color     }   } 然后生成实例对象,就等于是在调用函数:   var cat1 = Cat("大毛","黄色");   var cat2 = Cat("二毛","黑色"); 这种方法的问题依然是,cat1和cat2之间没有内在的联系,不能反映出它们是同一个原型对象的实例。 3. 构造函数模式 为了解决从原型对象生成实例的问题,Javascript提供了一个构造函数(Constructor)模式。 所谓"构造函数",其实就是一个普通函数,但是内部使用了this 变量 。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。 比如,猫的原型对象现在可以这样写,   function Cat(name,color){     this.name=name;     this.color=color;   } 我们现在就可以生成实例对象了。   var cat1 = new Cat("大毛","黄色");   var cat2 = new Cat("二毛","黑色");   alert(cat1.name); // 大毛   alert(cat1.color); // 黄色 这时cat1和cat2会自动含有一个constructor属性,指向它们的构造函数。   alert(cat1.constructor == Cat); //true   alert(cat2.constructor == Cat); //true Javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系。   alert(cat1 instanceof Cat); //true   alert(cat2 instanceof Cat); //true 4. 构造函数模式的问题 构造函数方法很好用,但是存在一个浪费内存的问题。 请看,我们现在为Cat对象添加一个不变的属性"type"(种类),再添加一个方法eat(吃老鼠)。那么,原型对象Cat就变成了下面这样:   function Cat(name,color){     this.name = name;     this.color = color;     this.type = "猫科动物";     this.eat = function(){alert("吃老鼠");};   } 还是采用同样的方法,生成实例:   var cat1 = new Cat("大毛","黄色");   var cat2 = new Cat ("二毛","黑色");   alert(cat1.type); // 猫科动物   cat1.eat(); // 吃老鼠 表面上好像没什么问题,但是实际上这样做,有一个很大的弊端。那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。   alert(cat1.eat == cat2.eat); //false 能不能让type属性和eat()方法在内存中只生成一次,然后所有实例都指向那个内存地址呢?回答是可以的。 5. Prototype模式 Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。 这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。   function Cat(name,color){     this.name = name;     this.color = color;   }   Cat.prototype.type = "猫科动物";   Cat.prototype.eat = function(){alert("吃老鼠")}; 然后,生成实例。   var cat1 = new Cat("大毛","黄色");   var cat2 = new Cat("二毛","黑色");   alert(cat1.type); // 猫科动物   cat1.eat(); // 吃老鼠 这时所有实例的type属性和eat()方法,其实都是一个内存地址,指向prototype对象,因此就提高了运行效率。   alert(cat1.eat == cat2.eat); //true 6. Prototype模式的验证方法 6.1 isPrototypeOf() 这个方法用来判断,某个proptotype对象和某个实例之间的关系。   alert(Cat.prototype.isPrototypeOf(cat1)); //true   alert(Cat.prototype.isPrototypeOf(cat2)); //true 6.2 hasOwnProperty() 每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。   alert(cat1.hasOwnProperty("name")); // true   alert(cat1.hasOwnProperty("type")); // false 6.3 in运算符 in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性。   alert("name" in cat1); // true   alert("type" in cat1); // true in运算符还可以用来遍历某个对象的所有属性。   for(var prop in cat1) { alert("cat1["+prop+"]="+cat1[prop]); } (完)

    2017/02/12 iteye

  3. Javascript的this用法

    摘自:http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html     this是Javascript语言的一个关键字。 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,   function test(){     this.x = 1;   } 随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。 下面分四种情况,详细讨论this的用法。 情况一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。 请看下面这段代码,它的运行结果是1。   function test(){     this.x = 1;     alert(this.x);   }   test(); // 1 为了证明this就是全局对象,我对代码做一些改变:   var x = 1;   function test(){     alert(this.x);   }   test(); // 1 运行结果还是1。再变一下:   var x = 1;   function test(){     this.x = 0;   }   test();   alert(x); //0 情况二:作为对象方法的调用 函数还可以作为某个对象的方法调用,这时this就指这个上级对象。   function test(){     alert(this.x);   }   var o = {};   o.x = 1;   o.m = test;   o.m(); // 1 情况三 作为构造函数调用 所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。   function test(){     this.x = 1;   }   var o = new test();   alert(o.x); // 1 运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:   var x = 2;   function test(){     this.x = 1;   }   var o = new test();   alert(x); //2 运行结果为2,表明全局变量x的值根本没变。 情况四 apply调用 apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这 第一个参数。   var x = 0;   function test(){     alert(this.x);   }   var o={};   o.x = 1;   o.m = test;   o.m.apply(); //0 apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。 如果把最后一行代码修改为   o.m.apply(o); //1 运行结果就变成了1,证明了这时this代表的是对象o。

    2017/02/12 iteye

  4. TDD

    TDD 优点:   1. 重构的勇气,回归测试一下即可   2. 保证代码的高内聚,低耦合

    2017/02/12 iteye

  5. linux 命令收集

    不显示/etc/services #开头的行, /etc/services文件并没有修改 sed -e '/^#/d' /etc/services | more 2. 忽略前十行,显示后面的内容 sed -e '1,10d' /etc/services | more 3. 打印所有包括BEGIN的行和END行之间的行的内容 sed -n -e '/BEGIN/,/END/p' /my/test/file | more 4. SAR pidstat -p 3132 2 5 //每隔2秒,显示5次,PID为3132的进程的CPU使用情况显示 pidstat -p 3132 2 5 -r //每隔2秒,显示5次,PID为3132的进程的内存使用情况显示

    2017/02/12 iteye

  6. jQuery学习

    jQuery, window.jQuery, window.$ or simply $ can be used interchangeably   2.  window.onload 和 $(document).ready(function())        // Override the onload event window.onload = function(){ // the page finished loading, do something here... }   This code actually overrides the onload event of the HTML tag. All this means to us is that our code will be executed soon as the page is finished loading. It makes sense because sometimes pages take time to load, or the downloading process is segmented by the browser architecture.     The jQuery internal architecture also utilizes the window.onload event, but before it does so, it checks whether the entire DOM (document object model) has been loaded because it is very important. It is not enough for jQuery to know that the page has been loaded, we must ensure that the DOM has been fully constructed. To provide us with this functionality, jQuery gives us a new method called ready that we can call on the main jQuery object itself.

    2017/02/12 iteye

  7. 导出page and portlet in IBM portal server

    XMLAccess 是一个小型的独立应用程序程序,它使用 HTTP 连接与服务器进行连接。因此,可以访问和远程配置门户网站。)一般在portal 安装目录\bin 下面 xmlaccess.bat。   1. 导出portal page   xmlaccess.bat -in d:***\ExportPage.xml -user ***-pwd *-url http://host/wps/config -out d:*\result_exportPage.xml    ExportPage.xml 文件格式可以参考 Portal安装目录\doc\xml-samples   例如: <!-- sample for exporting a page --> <portal action="locate"> <content-node action="export" uniquename="ibm.portal.Documents.Welcome" /> </portal>     其他还有导入导出portlet, page 等。  

    2017/02/12 iteye

  8. 在classpath上搜索类

    编译器在当前的classloader的classpath上找到类.方法(名字相同的即可,不需要签名相同),并在其中挑选(可能有重载)一个。如果没有找到签名相同的并不会到别的class library中或者上一级classloader中去寻找,而是直接报错。除非当前类中根本就没有这个名字的方法。   sorry, 上面的理解是错误的。真实的原因是“方法遮蔽”造成的。比如内部类中方法会遮蔽同名(可以不考虑参数)的外部类中的方法。----Thread.sleep()    

    2017/02/12 iteye