日期:2014-05-16  浏览次数:20313 次

javascript中的调用模式

一,方法调用模式

?当一个函数被保存为对象的一个属性时,我们称它为一个方法,此方法被调用时,this被绑定到该对象。?如果一个调用表达式包含一个属性存取表达式(即一个.点表达式或[subscript]下标表达式),那么它被当作一个方法来调用。

//创建myObject, 它有一个value属性和一个increment方法
//increment方法接受一个可选参数,如果参数不是数字,默认使用数字1
var myObject = {
     value : 0;
     increment : function (inc) {
          this.value += typeof inc === 'number' ? inc : 1;
     }
};

myObject.incement();
document.writeln(myObject.value);  //1
myObject.incement(2);
document.writeln(myObject.value);  //3

?

方法可以使用this去访问对象,所以它能从对象中取值或修改该对象。this到对象的绑定发生在调用的时侯。这个"超级"迟绑定(very late binding)使得函数可以对this高度复用。通过this可以得到它们所属对象的上下文的方法称为 公共方法。

?

二,函数调用模式

当一个函数并非一个对象的属性时,那么它被当作一个函数来调用。

var sum = add(3,4); //sum 的值为7

?当函数以此模式调用时,this被绑定到全局对象,这是语言设计上的错误。倘若语言设计正确,当内部函数被调用时,this应该仍绑定到外部函数的this 变量。这个设计错误的后果是方法不能通过内部函数来帮助它工作。因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。解决方案: 如果该方法定义一个变量并给它赋值为this.那么内部函数就可以能过那个变量访问到this.

//给myObject增加一个double方法
myObject.double = function() {
     var that = this;   //解决方法

     var helper = function() {
            that.value = add(that.value, that.value);
     };
      helper ();   //以函数形式调用helper
};


//以方法形式调用double

myObject.double();
document.writeln(myObject.value);   //6

?

三,构造器调用模式

?如果在一个函数前台带上new来调用,那么将创建一个连接到该函数的prototype成员的新对象,同时this将会绑定到那个新对象上。

//创建一个Quo的构造器函数。它构造一个带有status属性的对象。

var Quo = function(string) {
      this.status = string;
};

//给Quo的所有实例提供一个名为getStatus的公共方法。
Quo.prototype.getStatus = function() {
     return this.status;
};

//构造一个Quo实例
var myQuo = new Quo("ydwcn");
document.writeln(myQuo .getStatus); 

?