new‚𕕈󂷂é‚ׂ«4‚‚̗—R

Posted by Hiraku on 2011-05-13

‚¿‚å‚Á‚Ɛ¨‚¢‚É”C‚¹‚ď‘‚¢‚¿‚á‚Á‚½‚̂ōUŒ‚“I‚È•¶Í‚É‚È‚Á‚Ä‚Ü‚·BB ‚·‚²‚­‚í‚©‚è‚â‚·‚¢‰ðà‹LŽ–‚𒸂¢‚½‚̂ŁA‚±‚¿‚ç‚à•K“Ç‚Å‚·B
new ‚ð•s“–‚ÉæÈ‚ß‚é‰A–d‚Æ JavaScript ‚É‚¨‚¯‚éƒNƒ‰ƒX‚ÌŒp³\‘¢‚̘b - vivid memo
(’Ç‹LF2011/5/15)

‘O‚Ì‹LŽ–unew‚𕕈󂵂āAJavaScript‚ŃIƒuƒWƒFƒNƒgŽwŒü‚·‚év‚ªŽv‚¢‚Ì‚Ù‚©”½‹¿‚ª‘å‚«‚©‚Á‚½‚̂ŁA’²Žq‚ɏæ‚Á‚Ä•â‘«‚ð‘‚¢‚Ä‚Ý‚Ü‚·‚æB

ƒuƒRƒ‚ւ̕ԐM

u–³—p‚È•¡ŽG‰»‚ÉŒ©‚¦‚éBvu‰´‰´ƒIƒuƒWƒFƒNƒgŽwŒü‚È‹C‚ª‚·‚éBv‚Æ‚¢‚Á‚½‚²ˆÓŒ©‚à‚¢‚½‚¾‚¢‚½‚ñ‚Å‚·‚ªA•’Ê‚½‚Á‚½‚P‚Os‚̊֐”‚ŃIƒŒƒIƒŒƒIƒuƒWƒFƒNƒgŽwŒü‚È‚ñ‚čì‚ê‚È‚¢‚Å‚·‚æcBJavaScript‚Ì“à•”‹@\‚ð‚Ù‚Æ‚ñ‚Ç‚»‚Ì‚Ü‚ÜŽg‚Á‚Ä‚¢‚é‚©‚炱‚»A‚±‚̍s”‚ōςނ̂ł·B

‚»‚ê‚ɁA‚±‚̃vƒƒgƒ^ƒCƒv“IŒp³‚̍l‚¦•û‚ðDouglas Crockford‚ª•Ò‚ݏo‚µ‚½‚̂́A‚à‚¤‚T”N‚à‘O‚̘b‚Å‚·BECMAScript5‚©‚çObject.create‚Æ‚¢‚¤–¼‘O‚ÅŒöŽ®‚ɍ̗p‚³‚ꂽ‚±‚Æ‚©‚ç‚à‚í‚©‚é’Ê‚èAnew‚ðŽg‚¤ŒÃ“T“I‚ȃXƒ^ƒCƒ‹‚æ‚èAƒvƒƒgƒ^ƒCƒv“IŒp³‚ðŽg‚¤ƒpƒ^[ƒ“‚Ì•û‚ªƒ‚ƒ_ƒ“‚Å‚ ‚èŽå—¬‚É‚È‚è‚‚‚ ‚è‚Ü‚·BiobjectŠÖ”‚Í‘½dŒp³—p‚ÉŠg’£‚µ‚¿‚á‚Á‚Ä‚¢‚Ü‚·‚ªcj

‚¿‚å‚Á‚ÆŒ¾‚¢–ó‚ß‚¢‚Ä‚µ‚Ü‚¢‚Ü‚µ‚½B‘O‰ñ‚Ì‹LŽ–‚ł́AŽ„‚ªŽv‚¤u‚±‚¤‚·‚é‚Ì‚ªˆê”Ô‚í‚©‚è‚â‚·‚¢v‚Æ‚¢‚¤‘‚«•û‚ð‚Ü‚Æ‚ß‚Ü‚µ‚½B‚Å‚Í‹t‚ɁA•W€“I‚ȏ‘‚«•û‚ɏ]‚Á‚Änew‚ðŽg‚¤‚悤‚ɏ‘‚¢‚½ê‡‚Ç‚¤‚È‚é‚©A—v‚·‚é‚Énew‚ð‚³‚ñ‚´‚ñdis‚낤‚Æ‚¢‚¤‚Ì‚ªA¡‰ñ‚ÌŽïŽ|‚Å‚·B­‚µŽåŠÏ‚ª¬‚¶‚Á‚Ä‚¢‚é‚©‚à‚µ‚ê‚Ü‚¹‚ñ‚ªA‚²—¹³‚­‚¾‚³‚¢‚Ü‚¹B

newƒLƒ‚ƒC‚PFnew‚ð•t‚¯‚È‚­‚Ä‚àƒRƒ“ƒXƒgƒ‰ƒNƒ^‚ª“®ì‚µ‚Ä‚µ‚Ü‚¤

—Ⴆ‚΁A’·•ûŒ`‚̖ʐςðŒvŽZ‚·‚éƒNƒ‰ƒX‚ðnew‚ðŽg‚Á‚čì‚Á‚Ä‚Ý‚Ü‚µ‚傤B

function Rectangle(x, y) {
  this.x = x;
  this.y = y;
  alert(x + " x " + y + "‚Ì’·•ûŒ`‚ðì‚è‚Ü‚µ‚½");
}
Rectangle.prototype = {
  getArea: function(){ return this.x * this.y }
};

//Žg‚¢•û‚Ì—á
var rec1 = new Rectangle(3, 4);
alert(rec1.getArea()); //12

new‚ðŽg‚¤‚±‚Æ‚ð‘z’è‚·‚éƒNƒ‰ƒX‚̏‘‚«•û‚ðŽ„‚Í‚¤‚Ü‚­à–¾‚·‚鎩M‚ª–³‚¢‚̂ŁAÚ‚µ‚­‚͏‘‚«‚Ü‚¹‚ñ‚ªA‚²‚­‚²‚­ƒVƒ“ƒvƒ‹‚ȃNƒ‰ƒX‚È‚Ì‚Å“Ç‚ß‚é‚ÆŽv‚¢‚Ü‚·B

Œ©‚Ä‚í‚©‚é’Ê‚èARectangle‚̓Nƒ‰ƒXê—p‚Ì•¶–@‚ŏ‘‚¢‚Ä‚ ‚é‚킯‚Å‚Í‚È‚­A‚²‚­•’ʂ̊֐”‚Å‚·B‚È‚Ì‚Ånew‚ð•t‚¯‚¸‚ɌĂԂ±‚Æ‚ª‚Å‚«‚Ü‚·B‚»‚µ‚Änew‚ð‚‚¯‚¸‚ɌĂñ‚Å‚µ‚Ü‚Á‚½ê‡‚Ì‹““®‚ªA‚à‚¤”ñí‚É‹CŽ‚¿ˆ«‚¢‚±‚Æ‚É‚È‚è‚Ü‚·B

Rectangle(3,4); //new‚‚¯‚í‚·‚ê
print(x); //3
print(y); //4

new‚ð•t‚¯‚¸‚ɌĂñ‚¾ê‡AŠÖ”“à‚Ìthis‚̓Oƒ[ƒoƒ‹ƒIƒuƒWƒFƒNƒg‚ðŽw‚µ‚Ü‚·B‚¨‚©‚°‚ŃOƒ[ƒoƒ‹•Ï”‚Éx‚Æy‚ª’ljÁ‚³‚ê‚Ä‚µ‚Ü‚¢‚Ü‚µ‚½BƒOƒ[ƒoƒ‹‹óŠÔ‚ÉŠù‚Éx‚Æy‚ª‘¶Ý‚·‚éê‡A‚»‚ê‚ç‚̕ϐ”‚Í”j‰ó‚³‚ê‚Ä‚µ‚Ü‚¢‚Ü‚·B

ˆê‰žAÅ‹ß‚̏ˆ—Œn‚Å‚Ístrictƒ‚[ƒh‚Å‚±‚Ì‹““®‚ð—}§‚·‚邱‚Æ‚ª‚Å‚«‚é‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B

ˆ—Œn‚̃o[ƒWƒ‡ƒ“‚Ɉˑ¶‚µ‚È‚¢‚ōs‚¦‚é‘Ώˆ•û–@‚́AˆÈ‰º‚̂悤‚ȃK[ƒhß‚ð‘‚¢‚Ä‚¨‚­‚±‚Æ‚Å‚·B

function Rectangle(x, y) {
  if (!(this instanceof Rectangle))
    return new Rectangle(x, y);

  this.x = x;
  this.y = y;
  alert(x + " x " + y); //“®ìŠm”F‚Ì‚½‚ß‚Ìalert
}
Rectangle.prototype = {
  getArea: function(){ return this.x * this.y }
}

‚Å‚àƒNƒ‰ƒX‚ðì‚邽‚Ñ‚É‚±‚ñ‚È’èŒ^•¶‚ð‘‚©‚È‚¢‚Æ‚¢‚¯‚È‚¢‚È‚ñ‚āAƒAƒz‚炵‚¢‚ÆŽv‚¢‚Ü‚¹‚ñ‚©H

newƒLƒ‚ƒC‚QFŒp³‚ðl—¶‚·‚é•K—v‚ª‚ ‚é

JavaScript‚ł̓Cƒ“ƒXƒ^ƒ“ƒX‰»‚Æ’PˆêŒp³‚ª“¯‹`‚Å‚·B‚»‚Ì‚½‚߁AƒCƒ“ƒXƒ^ƒ“ƒX‰»‚·‚é‚Æ‚«‚¾‚¯‚Å‚È‚­AŒp³‚³‚¹‚é‚Æ‚«‚àl—¶‚µ‚ăRƒ“ƒXƒgƒ‰ƒNƒ^‚ð‘‚©‚È‚¢‚Æ‚¢‚¯‚Ü‚¹‚ñB

æ‚Ù‚Ç‚Ì’·•ûŒ`ƒNƒ‰ƒX‚ðŒp³‚µ‚āA³•ûŒ`ƒNƒ‰ƒX‚ðì‚邱‚Æ‚ðl‚¦‚Ä‚Ý‚Ü‚·B‘f’¼‚ɏ‘‚­‚Æ‚±‚¤‚È‚è‚Ü‚·B

function Square(x) {
  Rectangle.call(this, x, x);
}
Square.prototype = new Rectangle;

‚µ‚©‚µ‚±‚¤‘‚¢‚½ê‡Anew Rectangle‚µ‚½‚Æ‚«‚ÉRectangle‚̃Rƒ“ƒXƒgƒ‰ƒNƒ^‚ªŸŽè‚É“®‚¢‚Ä‚µ‚Ü‚¤‚½‚߁Aalert()‚ªŒÄ‚΂ê‚Ä‚µ‚Ü‚¢‚Ü‚·Bƒˆ‚ÉŒp³‚¾‚¯‚³‚¹‚悤‚ÆŽv‚¤‚ƁAH•v‚ª•K—v‚É‚È‚è‚Ü‚·B

‚â‚è•û‚Í‚¢‚­‚‚©‚ ‚è‚Ü‚·B

// Œp³‚ðl—¶‚µ‚½ƒRƒ“ƒXƒgƒ‰ƒNƒ^

//1. arguments‚̐”‚ÅŒ©‚é
function Rectangle(x, y) {
  if (arguments.length == 0) //Œp³‚³‚¹‚悤‚Æ‚µ‚Ä‚¢‚é‚̂ŁA‰½‚à‚µ‚È‚¢
    return this;
  ...
}

//2. arguments[0]‚ÌŒ^‚ðŒ©‚é
function Rectangle(x, y) {
  if (typeof arguments[0] == "string" && arguments[0] == "inherit")
    return this;
  ...
}
...
Square.prototype = new Rectangle("inherit"); //Œp³‚³‚¹‚é‚Æ‚«‚Í“Á’è‚̃L[ƒ[ƒh‚ð“n‚·

//3. ‚»‚à‚»‚àƒRƒ“ƒXƒgƒ‰ƒNƒ^‚ð•Êƒƒ\ƒbƒh‚É•ª‚¯‚Ä‚¨‚­
function Rectangle(){}
Rectangle.prototype = {
  init: function(x, y) { ... return this; }
  ...
};
var rec1 = new Rectangle().init(3,4);
...
Square.prototype = new Rectangle;

‚Ç‚ñ‚ȃRƒ“ƒXƒgƒ‰ƒNƒ^‚ð‘‚¢‚Ä‚¢‚悤‚ƑΉž‚Å‚«‚é‚悤‚ɁA‚±‚ñ‚ȏ‘‚«•û‚ð‚·‚é‚±‚Æ‚à‚ ‚è‚Ü‚·B

function Square(x) {
  Rectangle.call(this, x, x);
}
Square.prototype = (function(){
  function f(){}
  f.prototype = Rectangle.prototype;
  return new f;
})();

‚±‚̏‘‚«•û‚́AobjectŠÖ”‚ðƒCƒ“ƒ‰ƒCƒ““WŠJ‚µ‚½‚Ì‚Æ“¯‹`‚Å‚·cB‚»‚ê‚È‚ç‚¢‚Á‚»‚Ì‚±‚ƁAí‚ÉobjectŠÖ”‚ðŽg‚¤‚悤‚É‚µ‚½•û‚ªŠy‚¾‚ÆŽv‚¢‚Ü‚¹‚ñ‚©H

newƒLƒ‚ƒC‚RF‰½‚ð‚â‚Á‚Ä‚¢‚é‚Ì‚©‚í‚©‚è‚É‚­‚¢

JavaScriptŽ©‘̂̓vƒƒgƒ^ƒCƒvƒx[ƒX‚ōì‚ç‚ê‚Ä‚¢‚é‚­‚¹‚ɁAnew‚ðŽg‚¤‚ƃNƒ‰ƒXƒx[ƒX‚Ý‚½‚¢‚ȏ‘‚«•û‚ð‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B’†‚Å‚â‚Á‚Ä‚¢‚邱‚ƂƁAŠO‘¤‚©‚猩‚¦‚éƒCƒ“ƒ^[ƒtƒF[ƒX‚ªˆá‚¢‚·‚¬‚é‚Ì‚Å‚·B‚¨‚©‚°‚Å‹t‚É‚í‚©‚è‚É‚­‚­‚È‚Á‚Ä‚¢‚Ü‚·B

newƒLƒ‚ƒC‚SF“ǂ݂Â炢

new‚𐶂Ŏg‚¤ê‡Aprototype‚Æ‚¢‚¤’·‚Á‚½‚炵‚¢ƒL[ƒ[ƒh‚𑽗p‚·‚邱‚Æ‚É‚È‚è‚Ü‚·B‚±‚Ì‚¹‚¢‚ŁAnew‚ð‘O’ñ‚ɏ‘‚¢‚½ƒNƒ‰ƒX‚́A‘‚¶‚ēǂ݂Â炭‚Ȃ肪‚¿‚Å‚·B

ŽŽ‚µ‚ɕ⏕ŠÖ”‚ðˆêØŽg‚킸‚ɁAPenguinƒNƒ‰ƒX‚ð’è‹`‚µ‚Ä‚Ý‚Ü‚µ‚傤B

function Animal(){}
Animal.prototype = {
  name: "“®•¨"
, breathe: function(){alert("‚·[‚́[")}
, sayName: function(){alert(this.name)}
};

function Wing(){}
Wing.prototype = {
  fly: function(){alert("‚Ï‚½‚Ï‚½")}
};

function Bird(){}
Bird.prototype = new Animal;
Bird.prototype.name = "’¹";
Bird.prototype.fly = Wing.prototype.fly;

function Penguin(){}
Penguin.prototype = new Bird;
Penguin.prototype.name = "‚Ø‚ñ‚¬‚ñ";
Penguin.prototype.fly = function(){
  Bird.prototype.fly.apply(this, arguments);
  alert("‚Ø‚ñ‚¬‚ñ‚Í”ò‚ׂȂ¢c");
};

‚±‚Ì’ö“x‚Ì’Pƒ‚È‚à‚Ì‚Å‚àAprototype‚ð10‰ñ‚à‘‚©‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB

ˆê•û‚ŁAobjectŠÖ”‚ðŽg‚Á‚ď‘‚¯‚΂±‚¤‚È‚è‚Ü‚·B

var Animal = {
  name: "“®•¨"
, breathe: function(){alert("‚·[‚́[")}
, sayName: function(){alert(this.name)}
};

var Wing = {
  fly: function(){alert("‚Ï‚½‚Ï‚½")}
};

var Bird = object(Animal, Wing, {
  name: "’¹"
});

var Penguin = object(Bird, {
  fly: function(){
    Bird.fly.apply(this, arguments);
    alert("‚Ø‚ñ‚¬‚ñ‚Í”ò‚ׂȂ¢c");
  }
});

‚±‚¿‚ç‚Ì•û‚ª“Ç‚Ý‚â‚·‚¢‚ÆŽv‚¢‚Ü‚¹‚ñ‚©H ‚±‚ê‚Å‚ànew‚ðŽg‚Á‚½•û‚ª‚í‚©‚è‚â‚·‚¢A‚Æ‚¢‚¤l‚ª‚¢‚½‚çAŽ„‚Ì•‰‚¯‚Å‚·B‚Ç‚¤‚¼D‚«‚È‚¾‚¯new‚ðŽg‚Á‚Ä‚­‚¾‚³‚¢BB

‚Ü‚Æ‚ß

­‚È‚­‚Æ‚à‰´‚́Anew‚Í‹CŽ‚¿ˆ«‚¢‚ÆŽv‚¤B

‚½‚¾A‚¿‚á‚ñ‚Æ—‰ð‚µ‚½ã‚ÅŽg‚¤‚Ì‚Í‚à‚¿‚ë‚ñ–â‘è‚È‚¢‚ÆŽv‚¢‚Ü‚·‚æBnew‚𐶂Ŏg‚Á‚½•û‚ªŠÖ”‚ðŒÄ‚Ô‰ñ”‚ðŒ¸‚ç‚¹‚é‚̂ŁAƒpƒtƒH[ƒ}ƒ“ƒX‚ª—Ç‚­‚È‚é‚Æ‚¢‚¤ƒƒŠƒbƒg‚à‚ ‚è‚Ü‚·B

keyword: javascript

JavaScript‚̍ŐV‹LŽ–