javascript ûÓм̳ÐÕâ¸ö»¹ÊDZȽϵ°Ì۵ĵط½£¬Äã˵ҪÊÇÓÐÒ»¸öÀàÓм¸¸öÏàͬµÄÊôÐÔ£¬µ«ÊÇÎÒÃÇÓÖ²»Äܹ»È¥¼Ì³ÐËû£¬Õâ¸ö̫ʹ¿àÁË£¿Èç¹û³öÏÖÕâ¸öÎÊÌâÁËÎÒÃÇÄܹ»Ôõô°ì°¡£¬ÏëÏ뻹ÊDZȽϵ°Ì۵ġ£¡£¡£¡£°¡°¡°¡°¡
°¡£¬²»ÄÜÕâÃ´Íæ°É¡£µ«ÊÇ×ÐϸÏëÏëÔõô¿ÉÄÜ»á³öÏÖÕâÑùµÄÎÊÌâÁË£¬¿Ï¶¨»áÓÐÒ»ÖÖ»úÖÆÀ´ÊµÏÖ»òÕß˵¸Ä±äÕâ¸ö״̬£¬ÆäʵÔÚÕâÀïµÄ»°£¬ÎÒÃǾͿÉÒÔ˵˵ÎÒÃǽñÌìµÄÖ÷ÌâÁË£¬ÔÐÍ£¿
ʲôÊÇÔÐÍ£º
Ò»¡¢º¯Êý´´½¨¹ý³Ì
ÔÚÁ˽âÔÐÍÁ´Ö®Ç°ÎÒÃÇÏÈÀ´¿´¿´Ò»¸öº¯ÊýÔÚ´´½¨¹ý³ÌÖÐ×öÁËÄÄЩÊÂÇ飬¾ÙÒ»¸ö¿Õº¯ÊýµÄÀý×Ó£º
µ±ÎÒÃÇÔÚ´úÂëÀïÃæÉùÃ÷Õâôһ¸ö¿Õº¯Êý£¬js½âÎöµÄ±¾ÖÊÊÇ£º
1¡¢´´½¨Ò»¸ö¶ÔÏó£¨ÓÐconstructorÊôÐÔ¼°[[Prototype]]ÊôÐÔ£©£¬¸ù¾ÝECMA£¬ÆäÖÐ[[Prototype]]ÊôÐÔ²»¿É¼û¡¢²»¿Éö¾Ù
2¡¢´´½¨Ò»¸öº¯Êý£¨ÓÐname¡¢prototypeÊôÐÔ£©£¬ÔÙͨ¹ýprototypeÊôÐÔ ÒýÓà ¸Õ²Å´´½¨µÄ¶ÔÏó
3¡¢´´½¨±äÁ¿A£¬Í¬Ê±°Ñº¯ÊýµÄ ÒýÓà ¸³Öµ¸ø±äÁ¿A
ÈçÏÂͼËùʾ£º

£¨×¢ÒâͼÖж¼ÊÇ¡° ÒýÓà ¡±ÀàÐÍ£©
ÿ¸öº¯ÊýµÄ´´½¨¶¼¾ÀúÉÏÊö¹ý³Ì¡£
¶þ¡¢¹¹Ô캯Êý
ÄÇôʲôÊǹ¹Ô캯ÊýÄØ£¿
°´ÕÕECMAµÄ¶¨Òå
Constructor is a function that creates and initializes
the newly created object.
¹¹Ô캯ÊýÊÇÓÃÀ´Ð½¨Í¬Ê±³õʼ»¯Ò»¸öжÔÏóµÄº¯Êý¡£
ʲôÑùµÄº¯Êý¿ÉÒÔÓÃÀ´´´½¨Í¬Ê±³õʼ»¯Ð¶ÔÏóÄØ£¿´ð°¸ÊÇ£ºÈκÎÒ»¸öº¯Êý£¬°üÀ¨¿Õº¯Êý¡£
ËùÒÔ£¬½áÂÛÊÇ£ºÈκÎÒ»¸öº¯Êý¶¼¿ÉÒÔÊǹ¹Ô캯Êý¡£
Èý¡¢ÔÐÍ
¸ù¾ÝÇ°Ãæ¿Õº¯ÊýµÄ´´½¨Í¼Ê¾£¬ÎÒÃÇÖªµÀÿ¸öº¯ÊýÔÚ´´½¨µÄʱºò¶¼×Ô¶¯Ìí¼ÓÁËprototypeÊôÐÔ£¬Õâ¾ÍÊǺ¯ÊýµÄÔÐÍ£¬´ÓͼÖпÉÖªÆäʵÖʾÍÊǶÔÒ»¸ö¶ÔÏóµÄÒýÓã¨Õâ¸ö¶ÔÏóÔÝÇÒÈ¡ÃûÔÐͶÔÏ󣩡£
ÎÒÃÇ¿ÉÒÔ¶Ôº¯ÊýµÄÔÐͶÔÏó½øÐвÙ×÷£¬ºÍÆÕͨµÄ¶ÔÏóÎÞÒ죡һÆðÀ´Ö¤ÊµÒ»Ï¡£
Î§ÈÆ¸Õ²Å´´½¨µÄ¿Õº¯Êý£¬Õâ´Î¸ø¿Õº¯ÊýÔö¼ÓһЩ´úÂ룺
function A() { this.width = 10; this.data = [1,2,3]; this.key = "this is A"; } A._objectNum = 0;//¶¨ÒåAµÄÊôÐÔ A.prototype.say = function(){//¸øAµÄÔÐͶÔÏóÌí¼ÓÊôÐÔ alert("hello world") } |
µÚ7~9ÐдúÂë¾ÍÊǸøº¯ÊýµÄÔÐͶÔÏóÔö¼ÓÒ»¸ösayÊôÐÔ²¢ÒýÓÃÒ»¸öÄäÃûº¯Êý£¬¸ù¾Ý¡°º¯Êý´´½¨¡±¹ý³Ì£¬Í¼½âÈçÏ£º

£¨»ÒÉ«±³¾°¾ÍÊÇÔÚ¿Õº¯Êý»ù´¡ÉÏÔö¼ÓµÄÊôÐÔ£©
¼òµ¥ËµÔÐ;ÍÊǺ¯ÊýµÄÒ»¸öÊôÐÔ£¬ÔÚº¯ÊýµÄ´´½¨¹ý³ÌÖÐÓÉjs±àÒëÆ÷×Ô¶¯Ìí¼Ó¡£
ÄÇôÔÐÍÓÐʲôÓÃÄØ£¿
ÏÈÁ˽âÏÂnewÔËËã·û£¬ÈçÏ£º
var a1 = new A; var a2 = new A; |
ÕâÊÇͨ¹ý¹¹Ô캯ÊýÀ´´´½¨¶ÔÏóµÄ·½Ê½£¬ÄÇô´´½¨¶ÔÏóΪʲôҪÕâÑù´´½¨¶ø²»ÊÇÖ±½Óvar a1 = {};ÄØ£¿Õâ¾ÍÉæ¼°newµÄ¾ßÌå²½ÖèÁË£¬ÕâÀïµÄnew²Ù×÷¿ÉÒÔ·Ö³ÉÈý²½(ÒÔa1µÄ´´½¨ÎªÀý)£º
1¡¢Ð½¨Ò»¸ö¶ÔÏ󲢸³Öµ¸ø±äÁ¿a1£ºvar a1 = {};
2¡¢°ÑÕâ¸ö¶ÔÏóµÄ[[Prototype]]ÊôÐÔÖ¸Ïòº¯ÊýAµÄÔÐͶÔÏó£ºa1.[[Prototype]]
= A.prototype
3¡¢µ÷Óú¯ÊýA£¬Í¬Ê±°ÑthisÖ¸Ïò1Öд´½¨µÄ¶ÔÏóa1£¬¶Ô¶ÔÏó½øÐгõʼ»¯£ºA.apply(a1,arguments)
Æä½á¹¹Í¼Ê¾ÈçÏ£º

´ÓͼÖп´µ½£¬ÎÞÂÛÊǶÔÏóa1»¹ÊÇa2£¬¶¼ÓÐÒ»¸öÊôÐÔ±£´æÁ˶Ժ¯ÊýAµÄÔÐͶÔÏóµÄÒýÓ㬶ÔÓÚÕâЩ¶ÔÏóÀ´Ëµ£¬Ò»Ð©¹«Óõķ½·¨¿ÉÒÔÔÚº¯ÊýµÄÔÐÍÖÐÕÒµ½£¬½ÚÊ¡ÁËÄÚ´æ¿Õ¼ä¡£
ËÄ¡¢ÔÐÍÁ´
Á˽âÁËnewÔËËã·ûÒÔ¼°ÔÐ͵Ä×÷ÓÃÖ®ºó£¬Ò»ÆðÀ´¿´¿´Ê²Ã´ÊÇ[[Prototype]]£¿ÒÔ¼°¶ÔÏóÈçºÎÑØ×ÅÕâ¸öÒýÓÃÀ´½øÐÐÊôÐԵIJéÕÒ£¿
ÔÚjsµÄÊÀ½çÀÿ¸ö¶ÔÏóĬÈ϶¼ÓÐÒ»¸ö[[Prototype]]ÊôÐÔ£¬Æä±£´æ×ŵĵØÖ·¾Í¹¹³ÉÁ˶ÔÏóµÄÔÐÍÁ´£¬ËüÊÇÓÉjs±àÒëÆ÷ÔÚ¶ÔÏó
±»´´½¨ µÄʱºò×Ô¶¯Ìí¼ÓµÄ£¬ÆäȡֵÓÉnewÔËËã·ûµÄÓÒ²à²ÎÊý¾ö¶¨£ºµ±ÎÒÃÇvar object1 = {};µÄʱºò£¬object1µÄ[[Prototype]]¾ÍÖ¸ÏòObject¹¹Ô캯ÊýµÄÔÐͶÔÏó£¬ÒòΪvar
object1 = {};ʵÖÊÉϵÈÓÚvar object = new Object();£¨ÔÒò¿É²ÎÕÕÉÏÊö¶Ônew
AµÄ·ÖÎö¹ý³Ì£©¡£
¶ÔÏóÔÚ²éÕÒij¸öÊôÐÔµÄʱºò£¬»áÊ×ÏȱéÀú×ÔÉíµÄÊôÐÔ£¬Èç¹ûûÓÐÔò»á¼ÌÐø²éÕÒ[[Prototype]]ÒýÓõĶÔÏó£¬Èç¹ûÔÙûÓÐÔò¼ÌÐø²éÕÒ[[Prototype]].[[Prototype]]ÒýÓõĶÔÏó£¬ÒÀ´ÎÀàÍÆ£¬Ö±µ½[[Prototype]].¡.[[Prototype]]Ϊundefined£¨ObjectµÄ[[Prototype]]¾ÍÊÇundefined£©
ÈçÉÏͼËùʾ£º
//ÎÒÃÇÏëÒª»ñÈ¡a1.fGetName alert(a1.fGetName);//Êä³öundefined //1¡¢±éÀúa1¶ÔÏó±¾Éí //½á¹ûa1¶ÔÏó±¾ÉíûÓÐfGetNameÊôÐÔ //2¡¢ÕÒµ½a1µÄ[[Prototype]]£¬Ò²¾ÍÊÇÆä¶ÔÓ¦µÄ¶ÔÏóA.prototype£¬Í¬ //½á¹ûA.prototypeҲûÓÐÕâ¸öÊôÐÔ //3¡¢ÕÒµ½A.prototype¶ÔÏóµÄ[[Prototype]]£¬Ö¸ÏòÆä¶ÔÓ¦µÄ¶ÔÏóObject.prototype //½á¹ûObject.prototypeҲûÓÐfGetName //4¡¢ÊÔͼѰÕÒObject.prototypeµÄ[[Prototype]]ÊôÐÔ£¬½á¹û·µ»Øundefined£¬Õâ¾ÍÊÇa1.fGetNameµÄÖµ |
¼òµ¥Ëµ¾ÍÊÇͨ¹ý¶ÔÏóµÄ[[Prototype]]±£´æ¶ÔÁíÒ»¸ö¶ÔÏóµÄÒýÓã¬Í¨¹ýÕâ¸öÒýÓÃÍùÉϽøÐÐÊôÐԵIJéÕÒ£¬Õâ¾ÍÊÇÔÐÍÁ´¡£
Îå¡¢¼Ì³Ð
ÓÐÁËÔÐÍÁ´µÄ¸ÅÄ¾Í¿ÉÒÔ½øÐм̳С£
Õâ¸öʱºò²úÉúÁËBµÄÔÐÍB.prototype
ÔÐͱ¾Éí¾ÍÊÇÒ»¸öObject¶ÔÏó£¬ÎÒÃÇ¿ÉÒÔ¿´¿´ÀïÃæ·Å×ÅÄÄЩÊý¾Ý
B.prototype ʵ¼ÊÉϾÍÊÇ {constructor : B , [[Prototype]]
: Object.prototype}
ÒòΪprototype±¾ÉíÊÇÒ»¸öObject¶ÔÏóµÄʵÀý£¬ËùÒÔÆäÔÐÍÁ´Ö¸ÏòµÄÊÇObjectµÄÔÐÍ
B.prototype = A.prototype;//Ï൱ÓÚ°ÑBµÄprototypeÖ¸ÏòÁËAµÄprototype£» ÕâÑùÖ»ÊǼ̳ÐÁËAµÄprototype·½·¨£¬AÖеÄ×Ô¶¨Òå·½·¨Ôò²»¼Ì³Ð B.prototype.thisisb = "this is constructor B";//ÕâÑùÒ²»á¸Ä±äaµÄprototype |
µ«ÊÇÎÒÃÇÖ»Ïë°ÑBµÄÔÐÍÁ´Ö¸ÏòA£¬ÈçºÎʵÏÖ£¿
µÚÒ»ÖÖÊÇͨ¹ý¸Ä±äÔÐÍÁ´ÒýÓõØÖ·
B.prototype.__proto__ = A.prototype; |
ECMAÖв¢Ã»ÓÐ__proto__Õâ¸ö·½·¨£¬Õâ¸öÊÇff¡¢chromeµÈjs½âÊÍÆ÷Ìí¼ÓµÄ£¬µÈͬÓÚEMCAµÄ[[Prototype]]£¬Õâ²»ÊDZê×¼·½·¨£¬ÄÇôÈçºÎÔËÓñê×¼·½·¨ÄØ£¿
ÎÒÃÇÖªµÀnew²Ù×÷µÄʱºò£¬Êµ¼ÊÉÏÖ»ÊǰÑʵÀý¶ÔÏóµÄÔÐÍÁ´Ö¸ÏòÁ˹¹Ô캯ÊýµÄprototypeµØÖ·¿é£¬ÄÇôÎÒÃÇ¿ÉÒÔÕâÑù²Ù×÷
ÕâÑù²úÉúµÄ½á¹ûÊÇ£º
²úÉúÒ»¸öAµÄʵÀý£¬Í¬Ê±¸³Öµ¸øBµÄÔÐÍ£¬Ò²¼´B.prototype Ï൱ÓÚ¶ÔÏó {width :10 ,
data : [1,2,3] , key : "this is A" , [[Prototype]]
: A.prototype}
ÕâÑù¾Í°ÑAµÄÔÐÍͨ¹ýB.prototype.[[Prototype]]Õâ¸ö¶ÔÏóÊôÐÔ±£´æÆðÀ´£¬¹¹³ÉÁËÔÐ͵ÄÁ´½Ó
µ«ÊÇ×¢Ò⣬ÕâÑùB²úÉúµÄ¶ÔÏóµÄ¹¹Ô캯Êý·¢ÉúÁ˸ı䣬ÒòΪÔÚBÖÐûÓÐconstructorÊôÐÔ£¬Ö»ÄÜ´ÓÔÐÍÁ´ÕÒµ½A.prototype£¬¶Á³öconstructor:A
var b = new B; console.log(b.constructor);//output A |
ËùÒÔÎÒÃÇ»¹ÒªÈËΪÉè»ØB±¾Éí
B.prototype.constructor = B; //ÏÖÔÚBµÄÔÐ;ͱä³ÉÁË{width :10 , data : [1,2,3] , key : "this is A" , [[Prototype]] : A.prototype , constructor : B} console.log(b.constructor);//output B //ͬʱBÖ±½Óͨ¹ýÔÐͼ̳ÐÁËAµÄ×Ô¶¨ÒåÊôÐÔwidthºÍname console.log(b.data);//output [1,2,3] //ÕâÑùµÄ»µ´¦¾ÍÊÇ b.data.push(4);//Ö±½Ó¸Ä±äÁËprototypeµÄdataÊý×飨ÒýÓã© var c = new B; alert(c.data);//output [1,2,3,4] //ÆäʵÎÒÃÇÏëÒªµÄÖ»ÊÇÔÐÍÁ´£¬AµÄ×Ô¶¨ÒåÊôÐÔÎÒÃÇÏëÔÚBÖнøÐж¨Ò壨¶ø²»ÊÇÔÚprototype£© //¸ÃÈçºÎ½øÐм̳У¿ //¼ÈÈ»ÎÒÃDz»ÏëÒªAÖÐ×Ô¶¨ÒåµÄÊôÐÔ£¬ÄÇô¿ÉÒÔÏë°ì·¨°ÑÆä¹ýÂ˵ô //¿ÉÒÔн¨Ò»¸ö¿Õº¯Êý function F(){} //°Ñ¿Õº¯ÊýµÄÔÐÍÖ¸Ïò¹¹Ô캯ÊýAµÄÔÐÍ F.prototype = A.prototype; //Õâ¸öʱºòÔÙͨ¹ýnew²Ù×÷°ÑB.prototypeµÄÔÐÍÁ´Ö¸ÏòFµÄÔÐÍ B.prototype = new F; //Õâ¸öʱºòBµÄÔÐͱä³ÉÁË{[[Prototype]] : F.prototype} //ÕâÀïF.prototypeÆäʵֻÊÇÒ»¸öµØÖ·µÄÒýÓà //µ«ÊÇÓÉB´´½¨µÄʵÀýÆäconstructorÖ¸ÏòÁËA£¬ËùÒÔÕâÀïÒªÏÔʾÉèÖÃÒ»ÏÂB.prototypeµÄconstructorÊôÐÔ B.prototype.constructor = B; //Õâ¸öʱºòBµÄÔÐͱä³ÉÁË{constructor : B , [[Prototype]] : F.prototype} //ÕâÑù¾ÍʵÏÖÁËB¶ÔAµÄÔÐͼ̳Р|
ͼʾÈçÏ£¬ÆäÖкìÉ«²¿·Ö´ú±íÔÐÍÁ´£º

|