欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js 函數調用模式小結

 更新時間:2011年12月26日 23:11:26   作者:  
在javascript中一共有四種調用模式:方法調用模式、函數調用模式、構造器調用模式和apply調用模式。這些模式在如何初始化關鍵參數this上存在差異
方法調用模式
當一個函數被保存為對象的一個屬性時,我們稱之它為該對象的一個方法,那么this被綁定到該對象上。
復制代碼 代碼如下:

var myObject={
name : "myObject" ,
value : 0 ,
increment : function(num){
this.value += typeof(num) === 'number' ? num : 0;
} ,
toString : function(){
return '[Object:'+this.name+' {value:'+this.value+'}]';
}
}
alert(myObject);//[Object:myObject {value:0}]

函數調用模式
當一個函數并非一個對象的函數時,那么它被當作一個函數來調用,this被綁定到全局對象上。這是語言設計的一個錯誤。倘若語言設計正確,當內部函數調用時,this應該仍然綁定到外部函數的this變量上。如:
復制代碼 代碼如下:

var myObject={
name : "myObject" ,
value : 0 ,
increment : function(num){
this.value += typeof(num) === 'number' ? num : 0;
} ,
toString : function(){
return '[Object:'+this.name+' {value:'+this.value+'}]';
},
getInfo:function(){
return (function(){
return this.toString();//內部匿名函數中this指向了全局對象window
})();
}
}
alert(myObject.getInfo());//[object Window]

當幸運的是,有一個很容易的解決方案:定義一個變量并給它賦值為this,那么內部函數通過該變量訪問到指向該對象的this,如:
復制代碼 代碼如下:

var myObject={
name : "myObject" ,
value : 0 ,
increment : function(num){
this.value += typeof(num) === 'number' ? num : 0;
} ,
toString : function(){
return '[Object:'+this.name+' {value:'+this.value+'}]';
},
getInfo:function(){
var self=this;
return (function(){
return self.toString();//通過變量self指向myObject對象
})();
}
}
alert(myObject.getInfo());//[Object:myObject {value:0}]

構造器調用模式
JavaScript是一門基于原型繼承的語言。這意味著對象可以直接從其他對象繼承屬性。該語言是無類別的。
如果一個函數前面帶上new來調用,那么將創(chuàng)建一個隱藏連接到該函數的prototype成員的新對象,同時this將會被綁定到構造函數的實例上。
復制代碼 代碼如下:

function MyObject(name){
this.name=name || 'MyObject';
this.value=0;
this.increment=function(num){
this.value += typeof(num) === 'number' ? num : 0;
};
this.toString=function(){
return '[Object:'+this.name+' {value:'+this.value+'}]';
}
this.target=this;
}
MyObject.prototype.getInfo=function(){
return this.toString();
}
/*
同時創(chuàng)建一個MyObject.prototype對象,myObject繼承了MyObject.prototype的所有的屬性,
this綁定到了MyObject的實例上
*/
var myObject=new MyObject();
var otherObject=new MyObject();
//alert(myObject.target===myObject);//ture
//alert(myObject.target.getInfo());//[Object:MyObject {value:0}]
myObject.increment(10);
otherObject.increment(20);
alert(myObject.value);//10
alert(otherObject.value);//20

Apply 調用模式
JavaScript是一門函數式的面向對象編程語言,所以函數可以擁有方法。
函數的apply方法,如同該對象擁有此方法,使該對象擁有此方法。此時this指向該對象。
apply接收兩個參數,第一個是要綁定的對象(this指向的對象),第二個是參數數組.
復制代碼 代碼如下:

function MyObject(name){
this.name=name || 'MyObject';
this.value=0;
this.increment=function(num){
this.value += typeof(num) === 'number' ? num : 0;
};
this.toString=function(){
return '[Object:'+this.name+' {value:'+this.value+'}]';
}
this.target=this;
}
function getInfo(){
return this.toString();
}
var myObj=new MyObject();
alert(getInfo.apply(myObj));//[Object:MyObject {value:0}],this指向myObj
alert(getInfo.apply(window));//[object Window],this指向window

相關文章

最新評論