http://www.infoq.com/presentations/ajax-design-patterns
提到了JS
two interesting description here:
Pick&Mix Object
Free Function
Function is a closure(谁记得什么是离散中的闭包),Context matters to fucntion . Ojbect is a set of data with behavior while function is a behavior with a set of data(Closure).Function的堆栈就是它的上下文,它的closure.
函数(function)是一等公民,而方法(method)只能通过引用某对象去调用,应该说是某某对象的方法。函数本身却可以传来传去。
这里容易搞混的是:方法的定义需要function关键字,本来函数的定义同样用function,只是method在function前多了个名字和冒号,也可以用等号赋函数给某对象的方法,而对象本身(放在一个变量里)也是可以就是一个函数经过new的实例,同样涉及到function关键字,函数如果有new,就是返回一个对象。如果没有new,就是把函数直接存在变量里。所以function关键字扮演了很重要的角色。
(而大写的Function对象是系统对象,是一个类型,它的prototype可以被改写和扩展。会作用于所有用到function的地方)
几个经典的例子:
比如扩展function为”类”(其实是返回一个变量的函数,该函数对变量定义了一系列方法,该函数被放入变量中,可以用来实例化成对象,就Class来说,它还是”函数”):
var Class=function ()
{
var _class=function ()
{
this.initialize.apply(this,arguments);
};
for(i=0;i<arguments.length;i++)
{
superClass=arguments[i];
for(member in superClass.prototype)
{
_class.prototype[member]=superClass.prototype[member];
};
};
_class.child=function ()
{
return new Class(this);
};
_class.extend=function (f)
{
for(property in f)
{
_class.prototype[property]=f[property];
};
};
return _class;
};
而另一个例子是定义Object系统对象的extend(方法)成为一个函数:
Object.extend=function (destination,source)
{
for(property in source)
{
destination[property]=source[property];
};
return destination;
};
属性如果是函数,那么它就是方法,对象则可以直接用{}号定义(匿名对象,无需function关键字无需new)
Object.extend(
Event, {
observers:false,//属性property
element:function (event)
{
return event.target||event.srcElement;
},//方法Method
…
} )
下面这个来自prototype library,也是一个方法的定义,函数的运用能做到这个地步,就确实是懂得了javascript的function 了。
Reference of Closure
http://javascript.chinahtml.com/2006/javascript-11607091807203.shtml