é常å建对象æ¥è¡¨ç¤ºçå®ä¸çä¸çå®ä½ï¼å¦ç¨æ·å订åçï¼
let user = {
name: "John",
age: 30
};
å¹¶ä¸ï¼å¨ç°å®ä¸çä¸ï¼ç¨æ·å¯ä»¥è¿è¡ æä½ï¼ä»è´ç©è½¦ä¸æéæç©ãç»å½å注éçã
å¨ JavaScript ä¸ï¼è¡ä¸ºï¼actionï¼ç±å±æ§ä¸ç彿°æ¥è¡¨ç¤ºã
æ¹æ³ç¤ºä¾
åå¼å§ï¼æä»¬æ¥æ user 说 helloï¼
let user = {
name: "John",
age: 30
};
user.sayHi = function() {
alert("Hello!");
};
user.sayHi(); // Hello!
è¿éæä»¬ä½¿ç¨å½æ°è¡¨è¾¾å¼å建äºä¸ä¸ªå½æ°ï¼å¹¶å°å
¶æå®ç»å¯¹è±¡ç user.sayHi 屿§ã
éåæä»¬åè¿æ · user.sayHi() è°ç¨å®ãç¨æ·ç°å¨å¯ä»¥è¯´è¯äºï¼
ä½ä¸ºå¯¹è±¡å±æ§ç彿°è¢«ç§°ä¸º æ¹æ³ã
æä»¥ï¼å¨è¿æä»¬å¾å°äº user 对象ç sayHi æ¹æ³ã
å½ç¶ï¼æä»¬ä¹å¯ä»¥ä½¿ç¨é¢å 声æç彿°ä½ä¸ºæ¹æ³ï¼å°±åè¿æ ·ï¼
let user = {
// ...
};
// é¦å
ï¼å£°æå½æ°
function sayHi() {
alert("Hello!");
}
// ç¶åå°å
¶ä½ä¸ºä¸ä¸ªæ¹æ³æ·»å
user.sayHi = sayHi;
user.sayHi(); // Hello!
彿们å¨ä»£ç ä¸ç¨å¯¹è±¡è¡¨ç¤ºå®ä½æ¶ï¼å°±æ¯æè°ç é¢å对象ç¼ç¨ï¼ç®ç§°ä¸º âOOPâã
OOP æ¯ä¸é¨å¤§å¦é®ï¼æ¬èº«å°±æ¯ä¸é¨æè¶£çç§å¦ãææ ·éæ©åéçå®ä½ï¼å¦ä½ç»ç»å®ä»¬ä¹é´ç交äºï¼è¿å°±æ¯æ¶æï¼æå¾å¤å ³äºè¿æ¹é¢ç书ï¼ä¾å¦ E. GammaãR. HelmãR. Johnson å J. Vissides æèçã设计模å¼ï¼å¯å¤ç¨é¢å对象软件çåºç¡ãï¼G. Booch æèçãé¢å对象åæä¸è®¾è®¡ãçã
æ¹æ³ç®å
å¨å¯¹è±¡åé¢éä¸ï¼æä¸ç§æ´ççï¼å£°æï¼æ¹æ³çè¯æ³ï¼
// è¿äºå¯¹è±¡ä½ç¨ä¸æ ·
user = {
sayHi: function() {
alert("Hello");
}
};
// æ¹æ³ç®åçèµ·æ¥æ´å¥½ï¼å¯¹å§ï¼
let user = {
 sayHi() { // ä¸ "sayHi: function(){...}" 䏿 ·
alert("Hello");
}
};
å¦ä¸æç¤ºï¼æä»¬å¯ä»¥çç¥ "function"ï¼åªå sayHi()ã
说å®è¯ï¼è¿ç§è¡¨ç¤ºæ³è¿æ¯æäºä¸åãå¨å¯¹è±¡ç»§æ¿æ¹é¢æä¸äºç»å¾®çå·®å«ï¼ç¨åå°ä¼ä»ç»ï¼ï¼ä½ç®åå®ä»¬å¹¶ä¸éè¦ãå¨å 乿æçæ åµä¸ï¼æ´ççè¯æ³æ¯é¦éçã
æ¹æ³ä¸ç âthisâ
é常ï¼å¯¹è±¡æ¹æ³éè¦è®¿é®å¯¹è±¡ä¸åå¨çä¿¡æ¯æè½å®æå ¶å·¥ä½ã
ä¾å¦ï¼user.sayHi() ä¸ç代ç å¯è½éè¦ç¨å° user ç name 屿§ã
为äºè®¿é®è¯¥å¯¹è±¡ï¼æ¹æ³ä¸å¯ä»¥ä½¿ç¨ this å
³é®åã
this çå¼å°±æ¯å¨ç¹ä¹åçè¿ä¸ªå¯¹è±¡ï¼å³è°ç¨è¯¥æ¹æ³ç对象ã
举个ä¾åï¼
let user = {
name: "John",
age: 30,
sayHi() {
// "this" æçæ¯âå½åç对象â
alert(this.name);
}
};
user.sayHi(); // John
å¨è¿é user.sayHi() æ§è¡è¿ç¨ä¸ï¼this ç弿¯ userã
ææ¯ä¸è®²ï¼ä¹å¯ä»¥å¨ä¸ä½¿ç¨ this çæ
åµä¸ï¼éè¿å¤é¨åé忥å¼ç¨å®ï¼
let user = {
name: "John",
age: 30,
sayHi() {
  alert(user.name); // "user" æ¿ä»£ "this"
}
};
â¦â¦ä½è¿æ ·çä»£ç æ¯ä¸å¯é çã妿æä»¬å³å®å° user å¤å¶ç»å¦ä¸ä¸ªåéï¼ä¾å¦ admin = userï¼å¹¶èµå¦å¤çå¼ç» userï¼é£ä¹å®å°è®¿é®å°é误ç对象ã
ä¸é¢è¿ä¸ªç¤ºä¾è¯å®äºè¿ä¸ç¹ï¼
let user = {
name: "John",
age: 30,
sayHi() {
  alert( user.name ); // 导è´é误
}
};
let admin = user;
user = null; // éå让å
¶æ´ææ¾
admin.sayHi(); // TypeError: Cannot read property 'name' of null
妿æä»¬å¨ alert ä¸ä»¥ this.name æ¿æ¢ user.nameï¼é£ä¹ä»£ç 就伿£å¸¸è¿è¡ã
âthisâ ä¸åéå¶
å¨ JavaScript ä¸ï¼this å
³é®åä¸å
¶ä»å¤§å¤æ°ç¼ç¨è¯è¨ä¸çä¸åãJavaScript ä¸ç this å¯ä»¥ç¨äºä»»ä½å½æ°ï¼å³ä½¿å®ä¸æ¯å¯¹è±¡çæ¹æ³ã
ä¸é¢è¿æ ·çä»£ç æ²¡æè¯æ³é误ï¼
function sayHi() {
alert( this.name );
}
this ç弿¯å¨ä»£ç è¿è¡æ¶è®¡ç®åºæ¥çï¼å®åå³äºä»£ç ä¸ä¸æã
ä¾å¦ï¼è¿éç¸åç彿°è¢«åé ç»ä¸¤ä¸ªä¸åç对象ï¼å¨è°ç¨ä¸æçä¸åç âthisâ å¼ï¼
let user = { name: "John" };
let admin = { name: "Admin" };
function sayHi() {
alert( this.name );
}
// å¨ä¸¤ä¸ªå¯¹è±¡ä¸ä½¿ç¨ç¸åç彿°
user.f = sayHi;
admin.f = sayHi;
// è¿ä¸¤ä¸ªè°ç¨æä¸åç this å¼
// 彿°å
é¨ç "this" æ¯âç¹ç¬¦å·åé¢âçé£ä¸ªå¯¹è±¡
user.f(); // Johnï¼this == userï¼
admin.f(); // Adminï¼this == adminï¼
admin['f'](); // Adminï¼ä½¿ç¨ç¹ç¬¦å·ææ¹æ¬å·è¯æ³æ¥è®¿é®è¿ä¸ªæ¹æ³ï¼é½æ²¡æå
³ç³»ãï¼
è¿ä¸ªè§åå¾ç®åï¼å¦æ obj.f() 被è°ç¨äºï¼å this å¨ f 彿°è°ç¨æé´æ¯ objãæä»¥å¨ä¸é¢çä¾åä¸ this å
æ¯ userï¼ä¹åæ¯ adminã
this == undefinedæä»¬çè³å¯ä»¥å¨æ²¡æå¯¹è±¡çæ åµä¸è°ç¨å½æ°ï¼
function sayHi() {
alert(this);
}
sayHi(); // undefined
å¨è¿ç§æ
åµä¸ï¼ä¸¥æ ¼æ¨¡å¼ä¸ç this å¼ä¸º undefinedã妿æä»¬å°è¯è®¿é® this.nameï¼å°ä¼æ¥éã
å¨éä¸¥æ ¼æ¨¡å¼çæ
åµä¸ï¼this å°ä¼æ¯ å
¨å±å¯¹è±¡ï¼æµè§å¨ä¸ç windowï¼æä»¬ç¨åä¼å¨ å
¨å±å¯¹è±¡ ä¸ç« ä¸å¦ä¹ å®ï¼ãè¿æ¯ä¸ä¸ªåå²è¡ä¸ºï¼"use strict" å·²ç»å°å
¶ä¿®å¤äºã
é常è¿ç§è°ç¨æ¯ç¨åºåºéäºã妿å¨ä¸ä¸ªå½æ°å
鍿 thisï¼é£ä¹é常æå³ç宿¯å¨å¯¹è±¡ä¸ä¸æç¯å¢ä¸è¢«è°ç¨çã
this ç»å®çåæå¦æä½ ç»å¸¸ä½¿ç¨å
¶ä»çç¼ç¨è¯è¨ï¼é£ä¹ä½ å¯è½å·²ç»ä¹ æ¯äºâç»å® thisâçæ¦å¿µï¼å³å¨å¯¹è±¡ä¸å®ä¹çæ¹æ³æ»æ¯ææå该对象ç thisã
å¨ JavaScript ä¸ï¼this æ¯âèªç±âçï¼å®ç弿¯å¨è°ç¨æ¶è®¡ç®åºæ¥çï¼å®çå¼å¹¶ä¸åå³äºæ¹æ³å£°æçä½ç½®ï¼èæ¯åå³äºå¨âç¹ç¬¦å·åâçæ¯ä»ä¹å¯¹è±¡ã
å¨è¿è¡æ¶å¯¹ this æ±å¼çè¿ä¸ªæ¦å¿µæ¢æä¼ç¹ä¹æç¼ºç¹ã䏿¹é¢ï¼å½æ°å¯ä»¥è¢«éç¨äºä¸åç对象ãå¦ä¸æ¹é¢ï¼æ´å¤§ççµæ´»æ§é æäºæ´å¤§çåºéçå¯è½ã
è¿éæä»¬çç«åºå¹¶ä¸æ¯è¦è¯å¤ç¼ç¨è¯è¨çè¿ä¸ªè®¾è®¡æ¯å¥½æ¯åãèæ¯è¦äºè§£ææ ·ä½¿ç¨å®ï¼å¦ä½è¶å©é¿å®³ã
ç®å¤´å½æ°æ²¡æèªå·±ç âthisâ
ç®å¤´å½æ°æäºç¹å«ï¼å®ä»¬æ²¡æèªå·±ç thisã妿æä»¬å¨è¿æ ·ç彿°ä¸å¼ç¨ thisï¼this å¼åå³äºå¤é¨âæ£å¸¸çâ彿°ã
举个ä¾åï¼è¿éç arrow() 使ç¨ç this æ¥èªäºå¤é¨ç user.sayHi() æ¹æ³ï¼
let user = {
firstName: "Ilya",
sayHi() {
let arrow = () => alert(this.firstName);
arrow();
}
};
user.sayHi(); // Ilya
è¿æ¯ç®å¤´å½æ°çä¸ä¸ªç¹æ§ï¼å½æä»¬å¹¶ä¸æ³è¦ä¸ä¸ªç¬ç«ç thisï¼åèæ³ä»å¤é¨ä¸ä¸æä¸è·åæ¶ï¼å®å¾æç¨ãå¨åé¢ç æ·±å
¥çè§£ç®å¤´å½æ° ä¸ç« ä¸ï¼æä»¬å°æ·±å
¥ä»ç»ç®å¤´å½æ°ã
æ»ç»
- åå¨å¨å¯¹è±¡å±æ§ä¸ç彿°è¢«ç§°ä¸ºâæ¹æ³âã
- æ¹æ³å
许对象è¿è¡å
object.doSomething()è¿æ ·çâæä½âã - æ¹æ³å¯ä»¥å°å¯¹è±¡å¼ç¨ä¸º
thisã
this ç弿¯å¨ç¨åºè¿è¡æ¶å¾å°çã
- ä¸ä¸ªå½æ°å¨å£°ææ¶ï¼å¯è½å°±ä½¿ç¨äº
thisï¼ä½æ¯è¿ä¸ªthisåªæå¨å½æ°è¢«è°ç¨æ¶æä¼æå¼ã - å¯ä»¥å¨å¯¹è±¡ä¹é´å¤å¶å½æ°ã
- ä»¥âæ¹æ³âçè¯æ³è°ç¨å½æ°æ¶ï¼
object.method()ï¼è°ç¨è¿ç¨ä¸çthis弿¯objectã
请注æç®å¤´å½æ°æäºç¹å«ï¼å®ä»¬æ²¡æ thisãå¨ç®å¤´å½æ°å
é¨è®¿é®å°ç this 齿¯ä»å¤é¨è·åçã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼