¾c?/td> | å‘ç”ŸåŽŸå› |
EvalError | 错误å‘生在eval()函数ä¸?/td> |
RangeError | æ•°å—çš„å€ÆD¶…出javascriptå¯è¡¨½Cºçš„范围 |
ReferenceError | ä½¿ç”¨äº†éžæ³•的引用 |
SyntaxError | 在eval()函数调用ä¸å‘ç”Ÿäº†è¯æ³•é”™è¯¯ã€‚å…¶ä»–çš„è¯æ³•错误由æµè§ˆå™¨æŠ¥å‘ŠåQŒæ— 法通过try...catchè¯å¥å¤„ç† |
TypeError | å˜é‡çš„ç±»åž‹ä¸æ˜¯é¢„期所需çš?/td> |
URIError | 在encodeURI()或者decodeURI()函数ä¸å‘生了错误 |
ç‰ÒŽ(gu¨©)€?æ–ÒŽ(gu¨©)³• | ¾cÕdž‹/˜q”回¾cÕdž‹ | 说明 |
nodeName | String | 节点的åå?æ ÒŽ(gu¨©)®èŠ‚ç‚¹çš„ç±»åž‹è€Œå®šä¹?/td> |
nodeValue | String | 节点的å€?æ ÒŽ(gu¨©)®èŠ‚ç‚¹çš„ç±»åž‹è€Œå®šä¹?/td> |
nodeType | Number | 节点的类型常é‡å€ég¹‹ä¸€ |
ownerDocument | Document | 指员q™ä¸ªèŠ‚ç‚¹æ‰€å±žçš„æ–‡æ¡£ |
firstChild | Node | 指å‘在childNodes列表ä¸çš„½W¬ä¸€ä¸ªèŠ‚ç‚?/td> |
lastChild | Node | 指å‘在childNodes列表ä¸çš„æœ€åŽä¸€ä¸ªèŠ‚ç‚?/td> |
childNodes | NodeList | 所有å节点的列è¡?/td> |
previousSibling | Node | 指å‘å‰ä¸€ä¸ªå…„弟节ç‚?如果˜q™ä¸ªèŠ‚ç‚¹ž®±æ˜¯½W¬ä¸€ä¸ªå…„弟节点,那么该å€égØ“null |
nextSibling | Node | 指å‘åŽä¸€ä¸ªå…„弟节ç‚?如果˜q™ä¸ªèŠ‚ç‚¹ž®±æ˜¯æœ€åŽä¸€ä¸ªå…„弟节点,那么该å€égØ“null |
hasChildNodes() | Boolean | 当childNodes包å«ä¸€ä¸ªæˆ–多个节点æ—?˜q”回çœ?/td> |
attributes | NamedNodeMap | 包å«äº†ä»£è¡¨ä¸€ä¸ªå…ƒç´ çš„ç‰ÒŽ(gu¨©)€§çš„Attr对象;仅用于Element节点 |
appendChild(node) | Node | ž®†nodeæ·ÕdŠ åˆ°childNodes的末ž®?/td> |
removeChild(node) | Node | 从childNodesä¸åˆ 除node |
replaceChild(newnode,oldnode) | Node | ž®†childNodesä¸çš„oldnodeæ›¿æ¢æˆnewnode |
insertBefore(newnode,refnode) | Node | 在childNodesä¸çš„refnode之剿’å…¥newnodd |
ç‰ÒŽ(gu¨©)€?æ–ÒŽ(gu¨©)³• | 说明 |
caption | 指å‘<caption/>å…ƒç´ òq¶å°†å…¶æ”¾å…¥è¡¨æ ?/td> |
tBodies | <tbody/>å…ƒç´ çš„é›†å?/td> |
tFoot | 指å‘<tfoot/>å…ƒç´ åQˆå¦‚æžœå˜åœ¨ï¼‰ |
tHead | 指å‘<thead/>å…ƒç´ åQˆå¦‚æžœå˜åœ¨ï¼‰ |
rows | è¡¨æ ¼ä¸æ‰€æœ‰è¡Œçš„集å?/td> |
createTHead() | 创å¾<thead/>å…ƒç´ òq¶å°†å…¶æ”¾å…¥è¡¨æ ?/td> |
createTFood() | 创å¾<tfoot/>å…ƒç´ òq¶å°†å…¶æ”¾å…¥è¡¨æ ?/td> |
createCpation() | 创å¾<caption/>å…ƒç´ òq¶å°†å…¶æ”¾å…¥è¡¨æ ?/td> |
deleteTHead() | åˆ é™¤<thead/>å…ƒç´ |
deleteTFood() | åˆ é™¤<tfoot/>å…ƒç´ |
deleteCaption() | åˆ é™¤<caption/>å…ƒç´ |
deleteRow(position) | åˆ é™¤æŒ‡å®šä½ç½®ä¸Šçš„è¡?/td> |
insertRow(position) | 在rows集åˆä¸çš„æŒ‡å®šä½ç½®ä¸Šæ’入一个新è¡?/td> |
ç‰ÒŽ(gu¨©)€?æ–ÒŽ(gu¨©)³• | 说明 |
rows | <tbody/>䏿‰€æœ‰è¡Œçš„集å?/td> |
deleteRow(position) | åˆ é™¤æŒ‡å®šä½ç½®ä¸Šçš„è¡?/td> |
insertRow(position) | 在rows集åˆä¸çš„æŒ‡å®šä½ç½®ä¸Šæ’入一个新è¡?/td> |
ç‰ÒŽ(gu¨©)€?æ–ÒŽ(gu¨©)³• | 说明 |
cells | <tr/>å…ƒç´ ä¸æ‰€æœ‰çš„å•å…ƒæ ¼çš„é›†åˆ |
deleteCell(postion) | åˆ é™¤¾l™å®šä½ç½®ä¸Šçš„å•å…ƒæ ?/td> |
insertCell(postion) | 在cells集åˆçš„给点佾|®ä¸Šæ’入一个新的å•å…ƒæ ¼ |
EventUtil.formatEvent = function (oEvent) {
if (isIE && isWin) {
oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
oEvent.eventPhase = 2;
oEvent.isChar = (oEvent.charCode > 0);
oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
oEvent.pageY = oEvent.clientY + document.body.scrollTop;
oEvent.preventDefault = function () {
this.returnValue = false;
};
if (oEvent.type == "mouseout") {
oEvent.relatedTarget = oEvent.toElement;
} else if (oEvent.type == "mouseover") {
oEvent.relatedTarget = oEvent.fromElement;
}
oEvent.stopPropagation = function () {
this.cancelBubble = true;
};
oEvent.target = oEvent.srcElement;
oEvent.time = (new Date).getTime();
}
return oEvent;
};
EventUtil.getEvent = function() {
if (window.event) {
return this.formatEvent(window.event);
} else {
return EventUtil.getEvent.caller.arguments[0];
}
};
å—符 | æè¿° |
\t | 制表½W?/td> |
\n | æ¢è¡Œ½W?/td> |
\r | 回èžR½W?/td> |
\f | æ¢é¡µ½W?/td> |
\a | alertå—符 |
\e | escapeå—符 |
\cx | 与X相对应的控制å—符 |
\b | 回退å—符 |
\v | 垂直制表½W?/td> |
\0 | ½Iºå—½W?/td> |
代ç | ½{‰åŒäº?/td> | 匚w… |
. | [^\n\r] | 除了æ¢è¡Œå’Œå›žè½¦ä¹‹å¤–çš„ä»ÀL„å—符 |
\d | [0-9] | æ•°å— |
\D | [^0-9] | éžæ•°å—å—½W?/td> |
\s | [\t\n\x0B\f\r] | ½Iºç™½å—符 |
\S | [^\t\n\x0B\f\r] | éžç©ºç™½å—½W?/td> |
\w | [a-zA-Z_0-9] | å•è¯å—符åQˆæ‰€æœ‰å—æ¯ï¼Œæ‰€æœ‰çš„æ•°å—和下划线åQ?/td> |
\W | [^a-zA-Z_0-9] | éžå•è¯å—½W?/td> |
代ç | æè¿° |
? | 出现零次或一‹Æ?/td> |
* | 出现零次或多‹Æ?/td> |
+ | 出现一‹Æ¡æˆ–多次åQˆè‡³ž®‘出çŽîC¸€‹Æ¡ï¼‰ |
{n} | 一定出现n‹Æ?/td> |
{n,m} | 臛_°‘出现n‹Æ¡ä½†ä¸è¶…˜q‡m‹Æ?/td> |
{n,} | 臛_°‘出现n‹Æ?/td> |
贪婪 | 惰æ€?/td> | æ”¯é… | æè¿° |
? | ?? | ?+ | 零次或一‹Æ¡å‡ºçŽ?/td> |
* | *? | *+ | 零次或多‹Æ¡å‡ºçŽ?/td> |
+ | +? | ++ | 一‹Æ¡æˆ–多次出现 |
{n} | {n}? | {n}+ | æ°å¥½n‹Æ¡å‡ºçŽ?/td> |
{n,m} | {n,m}? | {n,m}+ | 臛_°‘n‹Æ¡è‡³å¤šm‹Æ¡å‡ºçŽ?/td> |
{n,} | {n,}? | {n,}+ | 臛_°‘n‹Æ¡å‡ºçŽ?/td> |
‹¹è§ˆå™¨å¯¹æ”¯é…é‡è¯çš„æ”¯æŒè¿˜å¾ˆä¸å®Œå–„。IEå’ŒOpera䏿”¯æŒï¼ŒMozillaž®†æ”¯é…é‡è¯çœ‹ä½œæ˜¯è´ªå©ªçš„ã€?br>
二ã€å¤æ‚模å¼?br>1.分组
分组是通过一¾pÕdˆ—括å·åŒ…围一¾pÕdˆ—å—符ã€å—½W¦ç±»ä»¥åŠé‡è¯æ¥ä‹É用的ã€?br>/dogdog/å¯ä‹É用分¾l„æ¥é‡å†™æˆ?(dog){2}/
/([bd]ad?)*/匚w…零个和多ä¸?ba","da","bad"æˆ?dad"
/(mom( and dad)?)/匚w…"mom" 或 "mom and dad"
2.åå‘引用
在表辑ּ计算完æˆåŽè¿˜å¯ä»¥æ€Žæ ·åˆ©ç”¨åˆ†ç»„åQŸæ¯ä¸ªåˆ†¾l„éƒ½è¢«å˜æ”‘Öœ¨ä¸€ä¸ªç‰¹ŒDŠçš„地方以备ž®†æ¥ä½¿ç”¨ã€‚这些å˜å‚¨åœ¨åˆ†ç»„ä¸çš„ç‰ÒŽ(gu¨©)®Šå€û|¼Œæˆ‘们¿UîC¹‹ä¸ºåå‘引用ã€?br>åå‘引用是按照从左到å³é‡åˆ°çš„左括å·å—½W¦çš„™åºåº˜q›è¡Œåˆ›å¾å’Œç¼–åïLš„。例如表辑ּ(A?(B?(C?)))ž®†äñ”生编å·ä»Ž1-3的三个åå‘引ç”?br>(1).(A?(B?(C?)))
(2).(B?(C?))
(3).(C?)
åå‘引用å¯ä»¥æœ‰å‡ ¿Uä¸åŒçš„使用æ–ÒŽ(gu¨©)³•ã€?br>首先åQŒä‹É用æ£åˆ™è¡¨è¾‘ּ对象的test(),match()或search()æ–ÒŽ(gu¨©)³•åŽï¼Œåå‘引用的值å¯ä»¥ä»ŽRegExpæž„é€ å‡½æ•îC¸èŽ·å¾—ã€‚ä¾‹
var sToMatch = "#123456789";
var reNumbers = /#(\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1); //outputs "123456789"
ç„¶åŽåQŒè¿˜å¯ä»¥ç›´æŽ¥åœ¨å®šä¹‰åˆ†¾l„的表达å¼ä¸åŒ…å«åå‘引用åQŒè¿™å¯ä»¥é€šè¿‡ä½¿ç”¨ç‰ÒŽ(gu¨©)®Šè½¬ä¹‰åºåˆ—如\1,\2½{‰ç‰å®žçް
例如
var sToMatch = "dogdog";
var reDogDog = /(dog)\1/;
alert(reDogDog.test(sToMatch)); //outputs "true"
æ£åˆ™è¡¨è¾¾å¼reDogDog首先创å¾å•è¯dog的组åQŒç„¶åŽåˆè¢«ç‰¹ŒDŠè{义åºåˆ—\1引用åQŒä‹É得这个æ£åˆ™è¡¨è¾‘Ö¼½{‰åŒäº?dogdog/
½W¬ä¸‰åQŒåå‘引用å¯ä»¥ç”¨åœ¨String对象的replace()æ–ÒŽ(gu¨©)³•ä¸ï¼Œ˜q™é€šè¿‡ä½¿ç”¨ç‰ÒŽ(gu¨©)®Šå—符åºåˆ—$1,$2½{‰ç‰æ¥å®žçŽ°ã€‚ä¾‹å¦?br>var sToChange = "1234 5678";
var reMatch = /(\d{4}) (\d{4})/
var sNew = sToChange.replace(reMatch,"$2 $1");
alert(sNew); //outputs "5678 1234"
3.候é€?br>æœ‰æ—¶å€™è¦æž„å¾ä¸€ä¸ªèƒ½å¤Ÿæ£¼‹®åŒ¹é…想得到所有å¯èƒ½æ€§çš„æ¨¡å¼æ˜¯å分困隄¡š„。如果è¦å¯¹åŒä¸€ä¸ªè¡¨è¾‘Ö¼åŒæ—¶åŒšw…"red"å’?break"æ—¶è¦æ€Žä¹ˆåšå‘¢åQŸè¿™äº›å•è¯å®Œå…¨æ²¡æœ‰ç›¸åŒçš„å—符åQŒè¿™æ ·å°±è¦å†™ä¸¤ä¸ªä¸åŒçš„æ£åˆ™è¡¨è¾‘Ö¼åQŒåƈ分别对两个嗽W¦ä¸²˜q›è¡ŒåŒšw…åQŒåƒ˜q™æ ·åQ?br>var sToMatch1 = "red";
var sToMatch2 = "black";
var reRed = /red/;
var reBlack = /black/;
alert(reRed.test(sToMatch1)||reBlack.test(sToMatch1)); //outputs "true"
alert(reRed.test(sToMatch2)||reBlack.test(sToMatch2)); //outputs "true"
˜q™å®Œæˆäº†ä»ÕdŠ¡åQŒä½†æ˜¯å分冗é•Ñ€‚还有å¦ä¸€¿Uæ–¹å¼å°±æ˜¯ä‹É用æ£åˆ™è¡¨è¾‘ּ的候选æ“作符。例åQ?br>var sToMatch1 = "red";
var sToMatch2 = "black";
var reRedOrBlack = /(red|black)/;
alert(reRedOrBlack.test(sToMatch1)); //outputs "true"
alert(reRedOrBlack.test(sToMatch2)); //outputs "true"
4.éžæ•èŽäh€§åˆ†¾l?br>创å¾åå‘引用的分¾l„,我们¿UîC¹‹ä¸ºæ•èŽäh€§åˆ†¾l„ã€‚åŒæ—¶è¿˜æœ‰ä¸€¿Uéžæ•获性分¾l„,它ä¸ä¼šåˆ›å»ºåå‘引用。在较长的æ£åˆ™è¡¨è¾‘Ö¼ä¸ï¼Œå˜å‚¨åå‘引用会é™ä½ŽåŒ¹é…速度ã€?br>如果è¦åˆ›å»ÞZ¸€ä¸ªéžæ•获性分¾l„,åªè¦åœ¨å·¦æ‹¬å·çš„åŽé¢åŠ ä¸Šä¸€ä¸ªé—®å·å’Œä¸€ä¸ªç´§è·Ÿçš„冒å·åQ?br>var sToMatch = "#123456789";
var reNumbers = /#(?:\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1); //outputs ""
5.å‰çž»
有时候,å¯èƒ½å¸Œæœ›åQŒå½“æŸä¸ªç‰¹å®šçš„å—½W¦åˆ†¾l„出现在å¦ä¸€ä¸ªå—½W¦ä¸²ä¹‹å‰æ—Óž¼Œæ‰åŽ»æ•获它。如果ä‹Éç”?#8220;å‰çž»”ž®±å¯ä»¥è®©˜q™ä¸ª˜q‡ç¨‹å˜å¾—å分½Ž€å•ã€?br>å‰çž»åQŒå‘Šè¯‰æ£åˆ™è¡¨è¾‘Ö¼˜q算器å‘å‰çœ‹ä¸€äº›å—½W¦è€Œä¸¿UÕdЍ其佾|®ã€‚åŒæ ·å˜åœ¨æ£å‘å‰çžÕd’Œè´Ÿå‘å‰çž»ã€‚æ£å‘å‰çžÀL£€æŸ¥çš„æ˜¯æŽ¥ä¸‹æ¥å‡ºçŽ°çš„æ˜¯ä¸æ˜¯æŸä¸ªç‰¹å®šå—符集。而负å‘å‰çžÕdˆ™æ˜¯æ£€æŸ¥æŽ¥ä¸‹æ¥çš„ä¸åº”该出现的特定嗽W¦é›†ã€?br>åˆ›å¾æ£å‘å‰çž»è¦å°†æ¨¡å¼æ”‘Öœ¨(?=å’?之间。注æ„è¿™ä¸æ˜¯åˆ†ç»„åQŒè™½ç„¶å®ƒä¹Ÿç”¨åˆ°æ‹¬å—÷€?br>var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /(bed(?=room)/;
alert(reBed.test(sToMatch1)); //outputs "true"
alert(RegExp.$1); //outputs "bed"
alert(reBed.test(sToMatch2)); //outputs "false"
è´Ÿå‘å‰çž»åQŒåˆ™è¦å°†æ¨¡å¼æ”‘Öœ¨(?!å’?之间ã€?br>var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /(bed(?!room)/;
alert(reBed.test(sToMatch1)); //outputs "false"
alert(reBed.test(sToMatch2)); //outputs "true"
alert(RegExp.$1); //outputs "bed"
6.边界
边界 用于æ£åˆ™è¡¨è¾¾å¼ä¸è¡¨ç¤ºæ¨¡å¼çš„ä½¾|®ã€‚下表列å‡ÞZº†å‡ ç§å¯èƒ½çš„è¾¹ç•?br>
边界 | æè¿° |
^ | 行开�/td> |
$ | 行结ž®?/td> |
\b | å•è¯çš„è¾¹ç•?/td> |
\B | éžå•è¯çš„边界 |
é•¿å | çŸå | æè¿° |
input | $_ | 最åŽç”¨äºŽåŒ¹é…çš„å—符ä¸?ä¼ é€’ç»™exec()或test()的嗽W¦ä¸²) |
lastMatch | $& | 最åŽåŒ¹é…çš„å—符 |
lastParen | $+ | 最åŽåŒ¹é…的分组 |
leftContext | $` | 在上‹Æ¡åŒ¹é…çš„å‰é¢çš„åä¸?/td> |
multiline | $* | ç”¨äºŽæŒ‡å®šæ˜¯å¦æ‰€æœ‰çš„表达å¼éƒ½ä½¿ç”¨å¤šè¡Œæ¨¡å¼çš„布?y¨u)®”å€?/td> |
rightContext | $' | 在上‹Æ¡åŒ¹é…之åŽçš„å串 |
function ClassB(sColor, sName) {
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;
this.name = sName;
this.sayName = function () {
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
所有新的属性和新的æ–ÒŽ(gu¨©)³•都必™åÕdœ¨åˆ 除了新æ–ÒŽ(gu¨©)³•的代ç 行åŽå®šä¹‰ã€‚å¦åˆ™ï¼Œå¯èƒ½ä¼šè¦†ç›–è¶…¾cÈš„相关属性和æ–ÒŽ(gu¨©)³•ã€?br>对象冒充å¯ä»¥æ”¯æŒå¤šç‘ôæ‰Ñ€?br>function ClassZ(){
this.newMethod = ClassX;
this.newMethod(sColor);
delete this.newMethod;
this.newMethod = ClassY;
this.newMethod(sColor);
delete this.newMethod;
}
˜q™é‡Œå˜åœ¨ä¸€ä¸ªå¼Šç«¯ï¼Œå¦‚æžœClassXå’ŒClassYå…ähœ‰ç›¸åŒçš„属性或æ–ÒŽ(gu¨©)³•åQŒClassYå…ähœ‰é«˜ä¼˜å…ˆçñ”åQŒå› 为ç‘ô承的是最åŽçš„¾c…R€?br>
2.call()æ–ÒŽ(gu¨©)³•
call()æ–ÒŽ(gu¨©)³•是与¾lå…¸çš„å¯¹è±¡å†’å……æ–¹æ³•æœ€ç›æ€¼¼çš„æ–¹æ³•,它的½W¬ä¸€ä¸ªå‚数用作thisçš„å¯¹è±¡ï¼Œå…¶ä»–å‚æ•°éƒ½ç›´æŽ¥ä¼ 递函数自íw«ã€?br>function ClassA(sColor) {
this.color = sColor;
this.sayColor = function () {
alert(this.color);
};
}
function ClassB(sColor, sName) {
//this.newMethod = ClassA;
//this.newMethod(color);
//delete this.newMethod;
ClassA.call(this, sColor);
this.name = sName;
this.sayName = function () {
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
3.apply()æ–ÒŽ(gu¨©)³•
apply()æ–ÒŽ(gu¨©)³•æœ‰ä¸¤ä¸ªå‚æ•ŽÍ¼Œç”¨ä½œthis的对象和è¦ä¼ 递傿•°çš„æ•°ç»„。例如:
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function () {
alert(this.color);
};
}
function ClassB(sColor, sName) {
//this.newMethod = ClassA;
//this.newMethod(color);
//delete this.newMethod;
ClassA.apply(this, arguments);
this.name = sName;
this.sayName = function () {
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
当然åQŒåªæœ‰è¶…¾cÖM¸çš„傿•°é¡ºåºä¸Žåç±»ä¸çš„傿•°™åºåºå®Œå…¨ä¸€è‡´æ—¶æ‰å¯ä»¥ä¼ 递傿•°å¯¹è±¡ã€‚å¦‚æžœä¸æ˜¯ï¼Œž®±å¿…™åÕdˆ›å»ÞZ¸€ä¸ªå•独的数组åQŒæŒ‰ç…§æ£¼‹®çš„™åºåºæ”„¡½®å‚数。æ¤å¤–,˜q˜å¯ä»¥ä‹É用call()æ–ÒŽ(gu¨©)³•ã€?br>
4.原型�br>function ClassA() {
}
ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function () {
alert(this.color);
};
function ClassB() {
}
ClassB.prototype = new ClassA();
ClassB.prototype.name = "";
ClassB.prototype.sayName = function () {
alert(this.name);
};
var objA = new ClassA();
var objB = new ClassB();
objA.color = "red";
objB.color = "blue";
objB.name = "Nicholas";
objA.sayColor();
objB.sayColor();
objB.sayName();
注æ„åQŒè°ƒç”¨ClassAçš„æž„é€ å‡½æ•°æ—¶åQŒæ²¡æœ‰ç»™å®ƒä¼ 递傿•°ã€‚è¿™åœ¨åŽŸåž‹é“¾ä¸æ˜¯æ ‡å‡†åšæ³•ã€‚è¦¼‹®ä¿æž„é€ å‡½æ•°æ²¡æœ‰ä“Q何傿•°ã€?br>原型铄¡š„å¼Šç«¯æ˜¯ä¸æ”¯æŒå¤šé‡¾l§æ‰¿ã€?br>
5.æ··åˆæ–¹å¼
与创建对象最好方å¼ç›¸ä¼û|¼Œç”¨å¯¹è±¡å†’å……ç‘ôæ‰¿æž„é€ å‡½æ•°çš„å±žæ€§ï¼Œç”¨åŽŸåž‹é“¾¾l§æ‰¿prototype对象的方法ã€?br>function ClassA(sColor) {
this.color = sColor;
}
ClassA.prototype.sayColor = function () {
alert(this.color);
};
function ClassB(sColor, sName) {
ClassA.call(this, sColor);
this.name = sName;
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function () {
alert(this.name);
};
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
var car1 = createCar("red", 4, 23);
var car2 = createCar("blue", 3, 25);
car1.showColor(); //outputs "red"
car2.showColor(); //outputs "blue"
˜q™ä¸ªä¾‹åä¸ï¼Œæ¯æ¬¡è°ƒç”¨å‡½æ•°createCar()åQŒéƒ½è¦åˆ›å»ºæ–°å‡½æ•°showColor()åQŒæ„å‘³ç€æ¯ä¸ªå¯¹è±¡éƒ½æœ‰è‡ªå·±çš„showColor()版本åQŒäº‹å®žä¸ŠåQŒæ¯ä¸ªå¯¹è±¡éƒ½å…׃ín了åŒä¸€ä¸ªå‡½æ•°ã€?br>有些开å‘者在工厂函数外定义对象的æ–ÒŽ(gu¨©)³•åQŒç„¶åŽé€šè¿‡å±žæ€§æŒ‡å‘该æ–ÒŽ(gu¨©)³•åQŒä»Žè€Œé¿å¼€˜q™ä¸ªé—®é¢˜ã€?br>function showColor(){
alert(this.color);
}
function createCar(color, doors, mpg) {
var tempcar = new Object;
tempcar.color = color;
tempcar.doors = doors;
tempcar.mpg = mpg;
tempcar.showColor = showColor;
return tempcar;
}
var car1 = createCar("red", 4, 23);
var car2 = createCar("blue", 3, 25);
car1.showColor(); //outputs "red"
car2.showColor(); //outputs "blue"
从功能上è®ÔŒ¼Œ˜q™æ ·è§£å†³äº†é‡å¤åˆ›å»ºå‡½æ•°å¯¹è±¡çš„问题åQŒä½†è¯¥å‡½æ•°çœ‹èµäh¥ä¸åƒå¯¹è±¡çš„æ–¹æ³•。所有这些问题引å‘了开å‘è€…å®šä¹‰çš„æž„é€ å‡½æ•°çš„å‡ºçŽ°ã€?br>
2.æž„é€ å‡½æ•°æ–¹æ³?br>function Car(sColor, iDoors, iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.showColor = function () {
alert(this.color)
};
}
var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);
oCar1.showColor(); //outputs "red"
oCar2.showColor(); //outputs "blue"
ž®±åƒå·¥åŽ‚å‡½æ•°åQŒæž„é€ å‡½æ•îC¼šé‡å¤ç”Ÿæˆå‡½æ•°åQŒäØ“æ¯ä¸ªå¯¹è±¡éƒ½åˆ›å»ºç‹¬ç«‹çš„函数版本。丘q‡ï¼Œä¹Ÿå¯ä»¥ç”¨å¤–部函数é‡å†™æž„é€ å‡½æ•ŽÍ¼ŒåŒæ ·åQŒè¿™ä¹ˆåšè¯ä¹‰ä¸Šæ— ä»ÖM½•æ„义ã€?br>
3.原型方å¼
function Car(){
}
Car.prototype.color = "red";
Car.prototype.doors= 4;
Car.prototype.mpg= 23;
Car.prototype.showColor = function(){
alert(this.color);
}
var oCar1 = new Car();
var oCar2 = new Car();
它解决了å‰é¢ä¸¤ç§æ–¹å¼å˜åœ¨çš„两个问题。但òq¶ä¸ž®½ähæ„。首先,˜q™ä¸ªæž„é€ å‡½æ•°æ²¡æœ‰å‚æ•°ã€‚ä‹Éç”¨åŽŸåž‹æ–¹å¼æ—¶åQŒä¸èƒ½é€šè¿‡æž„é€ å‡½æ•îC¼ 递傿•°åˆå§‹åŒ–属性的å€û|¼Œ˜q™ç‚¹å¾ˆä×oäºø™®¡åŽŒï¼Œä½†è¿˜æ²¡å®ŒåQŒçœŸæ£çš„问题出现在属性指å‘çš„æ˜¯å¯¹è±¡ï¼Œè€Œä¸æ˜¯å‡½æ•°æ—¶ã€‚考虑下é¢çš„例å:
function Car(){
}
Car.prototype.color = "red";
Car.prototype.doors= 4;
Car.prototype.mpg= 23;
Car.prototype.drivers = new Array("Mike","Sue");
Car.prototype.showColor = function(){
alert(this.color);
}
var oCar1 = new Car();
var oCar2 = new Car();
oCar1.drivers.push("Matt");
alert(oCar1.drivers); //outputs "Mike,Sue,Matt"
alert(oCar2.drivers); //outputs "Mike,Sue,Matt"
4.æ··åˆçš„æž„é€ å‡½æ•?原型方å¼
function Car(sColor, iDoors, iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike", "Sue");
}
Car.prototype.showColor = function () {
alert(this.color);
};
var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);
oCar1.drivers.push("Matt");
alert(oCar1.drivers); //outputs "Mike,Sue,Matt"
alert(oCar2.drivers); //outputs "Mike,Sue"
现在ž®±æ›´åƒåˆ›å»ÞZ¸€èˆ¬å¯¹è±¡äº†ã€‚所有的éžå‡½æ•°å±žæ€§éƒ½æœ‰æž„é€ å‡½æ•îC¸åˆ›å¾åQŒæ„味ç€åˆå¯ç”¨æž„é€ å‡½æ•°çš„å‚æ•°èµ‹äºˆå±žæ€§é»˜è®¤å€égº†ã€‚å› ä¸ºåªåˆ›å¾showColor()å‡½æ•°çš„ä¸€ä¸ªå®žä¾‹ï¼Œæ‰€ä»¥æ²¡æœ‰å†…å˜æµªè´V€?br>
5.动æ€åŽŸåž‹æ–¹æ³?br>function Car(sColor, iDoors, iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.drivers = new Array("Mike", "Sue");
if (typeof Car._initialized == "undefined") {
Car.prototype.showColor = function () {
alert(this.color);
};
Car._initialized = true;
}
}
var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);
oCar1.drivers.push("Matt");
alert(oCar1.drivers); //outputs "Mike,Sue,Matt"
alert(oCar2.drivers); //outputs "Mike,Sue"
动æ€åŽŸåž‹æ–¹æ³•çš„åŸºæœ¬æƒÏx³•ä¸ŽæØœåˆçš„æž„é€ å‡½æ•?原型方å¼ç›¸åŒåQŒå³åœ¨æž„é€ å‡½æ•°å†…å®šä¹‰éžå‡½æ•°å±žæ€§ï¼Œè€Œå‡½æ•°å±žæ€§åˆ™åˆ©ç”¨åŽŸåž‹å±žæ€§å®šä¹‰ã€‚å”¯ä¸€çš„åŒºåˆ«æ˜¯èµ‹äºˆå¯¹è±¡æ–ÒŽ(gu¨©)³•的佾|®ã€?/p>
6.æ··åˆå·¥åŽ‚æ–¹å¼
˜q™ç§æ–¹å¼é€šå¸¸æ˜¯åœ¨ä¸èƒ½åº”用å‰ä¸€¿Uæ–¹å¼æ—¶çš„å˜é€šæ–¹æ³•。它的目的是创å¾å‡æž„é€ å‡½æ•ŽÍ¼Œåªè¿”回å¦ä¸€¿U对象的新实例ã€?br>function Car() {
var tempcar = new Object;
tempcar.color = "red";
tempcar.doors = 4;
tempcar.mpg = 23;
tempcar.showColor = function () {
alert(this.color)
};
return tempcar;
}
与ç»å…¸æ–¹å¼ä¸åŒï¼Œ˜q™ç§æ–¹å¼ä½¿ç”¨new˜qç®—½W¦ï¼Œä½¿å®ƒçœ‹è“væ¥åƒçœŸæ£çš„æž„é€ å‡½æ•°ã€?br>
7.é‡‡ç”¨å“ªç§æ–¹å¼
如剿‰€˜qŽÍ¼Œç›®å‰ä½¿ç”¨æœ€òq¿æ³›çš„æ˜¯æ··åˆçš„æž„é€ å‡½æ•?原型方å¼ã€‚些外,动æ€åŽŸåž‹æ–¹æ³•ä¹Ÿå¾ˆæµè¡Œï¼Œåœ¨åŠŸèƒ½ä¸Šä¸Žå‰è€…ç‰ä»øP¼Œå¯ä»¥é‡‡ç”¨˜q™ä¸¤¿Uæ–¹å¼ä¸çš„ä“Q何一¿Uã€?br>
二ã€ä¿®æ”¹å¯¹è±?br>1.åˆ›å¾æ–°æ–¹æ³?br>å¯ä»¥ç”¨prototypeå±žæ€§äØ“ä»ÖM½•已有的类定义新方法,ž®±åƒå¤„ç†è‡ªå·±çš„ç±»ä¸€æ —÷€?br>例:
Array.prototype.indexOf = function(vItem){
for(var i=0;i<this.length;i++){
if(vItem == this[i]){
return i;
}
}
retunr -1;
}
最åŽï¼Œå¦‚果想给ECMAScriptä¸çš„æ¯ä¸ªæœ¬åœ°å¯¹è±¡æ·ÕdŠ æ–°æ–¹æ³•ï¼Œå¿…é¡»åœ¨Object对象的prototype属性上定义它ã€?br>
2.é‡å®šä¹‰å·²æœ‰æ–¹æ³?br>ž®±åƒèƒ½ç»™è‡ªå·±çš„ç±»å®šä¹‰æ–°æ–¹æ³•ä¸€æ øP¼Œä¹Ÿå¯é‡å®šä¹‰å·²æœ‰çš„æ–ÒŽ(gu¨©)³•。函数ååªæ˜¯æŒ‡å‘å‡½æ•°çš„æŒ‡é’ˆï¼Œå› æ¤å¯ä»¥è½ÀL˜“åœîC‹É它指å‘其他函数ã€?br>å¦?br>Function.prototype.toString = function(){
return "Function code hidden";
}
function sayHi(){
alert("hi");
}
alert(sayHi.toString()); //outputs "Function code hidden"