|
一、this指向構(gòu)造函數(shù)實(shí)例化對象
在上篇文章中,我們提到了使用new和不使用new調(diào)用構(gòu)造函數(shù)的區(qū)別,如下例:
復(fù)制代碼 代碼如下:
function Benjamin(username, sex) {
this.username = username;
this.sex = sex;
}
var benjamin = new Benjamin("zuojj", "male");
//Outputs: Benjamin{sex: "male",username: "zuojj"}
console.log(benjamin);
var ben = Benjamin("zhangsan", "female");
//Outputs: undefined
console.log(ben);
當(dāng)構(gòu)造函數(shù)當(dāng)做普通函數(shù)被調(diào)用時,并沒有返回值,同時this指向全局對象。那么我們?nèi)绾蝸肀苊庖驗(yàn)槿鄙賜ew關(guān)鍵字,而產(chǎn)生的問題呢?
復(fù)制代碼 代碼如下:
function Benjamin(username, sex) {
//Check whether "this" is a "Benjamin" object
if(this instanceof Benjamin) {
this.username = username;
this.sex = sex;
}else {
return new Benjamin(username, sex);
}
}
var benjamin = new Benjamin("zuojj", "male");
//Outputs: Benjamin{sex: "male",username: "zuojj"}
console.log(benjamin);
var ben = Benjamin("zhangsan", "female");
//Outputs: Benjamin {username: "zhangsan", sex: "female"}
console.log(ben);
在上例中,我們首先檢查this是否是Benjammin的實(shí)例,如果不是,使用new自動調(diào)用構(gòu)造函數(shù),并實(shí)例化,這意味著,我們不再需要擔(dān)心,遺漏new關(guān)鍵字實(shí)例化構(gòu)造函數(shù)。當(dāng)然這樣我們可能會養(yǎng)成一個壞的習(xí)慣,如果避免這種現(xiàn)象呢?我們可以拋出一個錯誤,像下面這樣:
復(fù)制代碼 代碼如下:
function Benjamin(username, sex) {
//Check whether "this" is a "Benjamin" object
if(this instanceof Benjamin) {
this.username = username;
this.sex = sex;
}else {
// If not, throw error.
throw new Error("`Benjamin` invoked without `new`");
}
}
二、this指向調(diào)用該函數(shù)的對象
看下面的例子:
復(fù)制代碼 代碼如下:
var x = 10;
var obj = {
x: 10,
output: function() {
//Outputs: true
console.log(this === obj);
return this.x;
},
innerobj: {
x: 30,
output: function() {
//Outputs: true
console.log(this === obj.innerobj);
return this.x;
}
}
};
//Outputs: 10
console.log(obj.output());
//Outputs: 30
console.log(obj.innerobj.output());
三、this指向全局對象
在上面討論構(gòu)造函數(shù)的時候我們也討論到不適用new的時候,this會指向全局對象,下面我們來看看兩種常見的容易犯錯的實(shí)例:
復(fù)制代碼 代碼如下:
var x = 100;
var obj = {
x: 10,
output: function() {
(function() {
//Outputs: true
console.log(this === window);
//Outputs: Inner: 100
console.log("Inner:" + this.x);
})();
return this.x;
}
};
//Outputs: 10
console.log(obj.output());
在使用閉包的時候,作用域發(fā)生變化,this指向window(瀏覽器中)。
復(fù)制代碼 代碼如下:
var x = 100;
var obj = {
x: 10,
output: function() {
return this.x;
}
};
var output = obj.output;
//Outputs: 10
console.log(obj.output());
//Outputs: 100
console.log(output());
var obj2 = {
x: 30,
output: obj.output
}
//Outputs: 30
console.log(obj2.output());
此時this始終指向函數(shù)調(diào)用時的對象。
四、this指向apply/call()方法指派的對象
復(fù)制代碼 代碼如下:
var x = 100;
var obj = {
x: 10,
output: function() {
return this.x;
}
};
//Outputs: 10
console.log(obj.output());
var obj2 = {
x: 40,
output: obj.output
}
//Outputs: 40
console.log(obj.output.call(obj2));
//Outputs: 10
console.log(obj2.output.apply(obj));
五、callback函數(shù) 主站蜘蛛池模板: 日本一二三区在线视频 | 国产成人精品午夜福麻豆报告 | 热综合一本伊人久久精品 | 美女露出撒尿的部位 | 高H纯肉NP 弄潮NP男男 | 9420高清免费观看在线大全 | 亚洲精品国产专区91在线 | 欧美一区二区三区激情视频 | 97超碰在线视频 免费 | 日本漂亮妈妈7观整有限中 日本片bbbxxx | 国产亚洲精品视频在线网 | 日日夜夜影院在线播放 | WWW久久只有这里有精品 | 亚洲 欧美 视频 手机在线 | 久久九九有精品国产23百花影院 | 日日干夜夜啪蕉视频 | 婷婷五月久久精品国产亚洲 | 亚洲精品无码专区在线播放 | 九九久久国产精品大片 | 免费无码一区二区三区蜜桃大 | 欧美xxx性| 亚洲m男在线中文字幕 | 无码人妻精品一区二区蜜桃色欲 | 国产成人精品s8p视频 | 强伦姧久久久久久久久久 | 成人在线视频网站 | 精品无码久久久久久久动漫 | 欧美视频精品一区二区三区 | 天堂视频在线观看免费完整版 | 999av视频 | 国内自拍 在线 亚洲 欧美 | 午夜DV内射一区区 | 免费的好黄的漫画 | 伊人精品国产 | 91av影院| 国产又粗又猛又爽又黄的免费视频 | 国产99视频精品免费播放 | 99久久国产露脸精品竹菊传煤 | 女子叉开腿让男子桶免费软件 | 亚洲日韩KKK444KKK聚色 | 免费在线亚洲视频 |