当一个函数被保存为对象的一个属性时,我们称它为一个方法,此方法被调用时,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);