ėë°ėĪíŽëĶ―íļë íëĄí íė
ęļ°ë° ėļėīėīëĪ.
íīëėĪ ęļ°ë° ėļėīėėë 'ėė'ė ėŽėĐíė§ë§ íëĄí íė
ęļ°ë° ėļėīėėë ėīëĪ ę°ėēīëĨž ėíėžëĄ ėžęģ ėīëĨž ëģĩė (ė°ļėĄ°)íĻėžëĄėĻ ėėęģž ëđė·í íĻęģžëĨž ėŧëëĪ.
prototype / __proto__
ėīëĪ ėėąė íĻėëĨž new ė°ė°ėė íĻęŧ íļėķíëĐī
ėėąė íĻėė ė ėë ëīėĐė ë°íėžëĄ ėëĄėī ėļėĪíīėĪę° ėėąëëĪ.
ėīë ėļėĪíīėĪėë __proto__
ëžë (ėëĩ ę°ëĨí) íëĄíží°ę° ėëėžëĄ ëķėŽëëë°
ėī íëĄíží°ë ėėąė íĻėė prototypeėīëžë íëĄíží°ëĨž ė°ļėĄ°íëĪ.
ėŽęļ°ė prototypeė ę°ėēīėīęģ , ėīëĨž ė°ļėĄ°íë __proto__
ėė ę°ėēīėīëĪ.
prototype ę°ėēī ëīëķė ėļėĪíīėĪę° ėŽėĐí ė ėë ëĐėëëĨž ė ėĨíëĐī
ėļėĪíīėĪėėë __proto__
ëĨž íĩíī ėī ëĐėëė ė ę·ží ė ėęē ëëĪ.
ėĪëŽīėėë ę°ęļė
__proto__
ëėObject.getPrototypeOf()
íđėObject.create()
ëĨž ėīėĐíëëĄ íëĪ.
ėëĩ ę°ëĨí íëĄíží° __proto__
var Person = function (name) {
this._name = name;
};
Person.prototype.getName = function () {
return this._name;
}
var suzi = new Person("Suzi");
suzi.__proto__.getName(); // undefined
suzi.__proto__.getName()
ę° undefinedëĨž return íëĪ.
ėīë getName()ė ëĐėëėļë° ëĐėëë íļėķ ė ëĐėëëŠ
ë°ëĄ ėė ę°ėēīę° ęģ§ thisę° ëęļ° ëëŽļėīëĪ.
ėī ęē―ė° suzi.__proto__
ę° thisę° ëëë° ėī ę°ėēīėë _name íëĄíží°ę° ėĄīėŽíė§ ėęļ° ëëŽļė undefinedę° ë°íë ęēėīëĪ.
suzi.getName(); // Suzi
__proto__
ë ėëĩ ę°ëĨí íëĄíží°ėīęļ° ëëŽļė ėė ę°ėī ėėąíëĐī Suzi ę°ė ėŧė ė ėëĪ.
suzi.__proto__
ė getName ëĐėëëĨž ėŽėĐíëĐīėë getName ëĐėë ėėėė thisę° suzi.__proto__
ę° ėëëž suziëĨž ę°ëĶŽíĪëëĄ íë ęēėīëĪ.
__proto__
ë ėëĩ ę°ëĨí íëĄíží°ėīęļ° ëëŽļė ėėąė íĻėė prototypeė ėīëĪ ëĐėëë íëĄíží°ę° ėëĪëĐī, ėļėĪíīėĪėėë ë§ėđ ėė ė ęēėēëž íīëđ ëĐėëë íëĄíží°ė ė ę·ží ė ėęē ëëĪ.
íŽëĄŽ ę°ë°ė ëęĩŽëĄ ėīíīëģīęļ°
var arr = [1, 2];
console.dir(arr);
console.dir(Array);
ėīëĪ ėėąė íĻėė ėļėĪíīėĪë íīëđ ėėąė íĻėė ėīëĶė íęļ°íĻėžëĄėĻ íīëđ íĻėė ėļėĪíīėĪėė íęļ°íëĪ. ex) Array(2), Constructor(name) ëą
ėėąė íĻėė prototypeęģž ėļėĪíīėĪė __proto__
ę° ëėží ęēė íėļí ė ėëĪ. (ėą
ė°ļęģ )
ííļ, ėķë Ĩ ęē°ęģžėė ė§ėėė ėīęą° ę°ëĨí íëĄíží°, ėĶ for in ëąėžëĄ ę°ėēīė íëĄíží° ė ėēīė ė ę·žíęģ ė í ë ė ę·ž ę°ëĨí íëĄíží°ëĨž ë§íëĪ.
ėėąė íĻėė íëĄíží°ėļ prototype ę°ėēī ëīëķėë constructorëžë íëĄíží°ę° ėëĪ.
ėėąė íĻėė prototype íëĄíží°ëĨž ė°ļėĄ°íë ėļėĪíīėĪė __proto__
ę°ėēī ëīëķėë ë§ė°Žę°ė§ėīëĪ.
constructor íëĄíží°ë ëĻėī ę·ļëëĄ ėëė ėėąė íĻėëĨž ė°ļėĄ°íë ęēėžëĄ ėļėĪíīėĪëĄëķí° ę·ļ ėíėī ëŽīėėļė§ëĨž ė ė ėë ėëĻėīëĪ.
var arr = [1, 2];
var arr2 = arr.constructor(3, 4);
console.log(arr2); // [3, 4]
ííļ, constructorë
ė―ęļ° ė ėĐ ėėąėī ëķėŽë ėėļė ėļ ęē―ė°(ęļ°ëģļí ëĶŽí°ëī ëģė - number, string, boolean)ëĨž ė ėļíęģ ë ę°ė ë°ęŋ ė ėëĪ.
ę·ļë°ë° constructorė ę°ė ë°ęŋë ėīëŊļ ë§ëĪėīė§ ėļėĪíīėĪė ėíėī ë°ëęą°ë ë°ėīí° íė
ėī ëģíė§ë ėëëĪ.
ėĶ, constructorëĨž ëģęē―íëëžë ę·ļė ė°ļėĄ°íë ëėėī ëģęē―ë ëŋėīëŊëĄ ėīëĪ ėļėĪíīėĪė ėėąė ė ëģīëĨž ėėëīęļ° ėíī constructor íëĄíží°ëĨž ėŽėĐíë ęēėī íė ėė íė§ë ėė ęēėīëĪ.
var Person = function (name) {
this.name = name;
}
var p1 = new Person("ėŽë1");
var p1Proto = Object.getPrototypeOf(p1);
var p2 = new p1Proto.constructor("ėŽë2");
p1ęģž p2ë ëŠĻë Personė ėļėĪíīėĪę° ëëĪ.
ėė ėīíīëģļ ęēėēëž prototype ę°ėēīëĨž ė°ļėĄ°íë __proto__
ëĨž ėëĩíëĐī ėļėĪíīėĪë prototypeė ė ėë íëĄíží°ë ëĐėëëĨž ėė ė ęēėēëž ėŽėĐí ė ėëĪ.
ííļ, ėļėĪíīėĪę° prototype ę°ėēīė ė ėë íëĄíží° ëë ëĐėëė ëėží ėīëĶė íëĄíží° ëë ëĐėëëĨž ę°ė§ęģ ėë ęē―ė°
ėë ëĐėë ėĪëēëžėīëę° ë°ėíëĪ.
ëĐėë ėĪëēëžėīëë ėëģļ ëĐėëę° ę·ļëëĄ ėë ėíėė ëĪëĨļ ëĐėëëĨž ę·ļ ėė ëŪėīėė°ë ęē
ė ë§íëĪ.
var Person = function (name) {
this.name = name;
}
Person.prototype.getName = function (name) {
return this.name
}
var iu = new Person("ė§ęļ");
iu.getName = function () {
return "ë°ëĄ" + this.name;
};
console.log(iu.getName()); // ë°ëĄ ė§ęļ(o), ė§ęļ(x)
iu.__proto__.getName
ėī ėë iu ę°ėēīė ėë getName ëĐėëę° íļėķë ęēė íėļí ė ėëĪ.
ėīë ėë°ėĪíŽëĶ―íļ ėė§ėī ëĐėëëĨž ė°ūė ë ė°ė ę°ėĨ ę°ęđėī ëėėļ iu ę°ėēī ėė ė íëĄíží°ëĨž ęēėíęģ , ėėžëĐī ę·ļ ëĪėėžëĄ ę°ęđėī ëėėļ __proto__
ëĨž ęēėíęļ° ëëŽļėīëĪ.
ëĐėë ėĪëēëžėīëĐėī ėīëĢĻėīė ļ ėë ėíĐėė prototypeė ėë ëĐėëė ė ę·žíë ĪëĐī call ëĐėëëĨž ėīėĐíī getName ëĐėë ëīëķėėė thisëĨž iu.__proto__
ę°ėēīėė iu ę°ėēīëĄ ë°ęŋėĪėž íëĪ.
iu.__proto__.getName(); // undefined
iu.__proto__.getName.call(iu); // ė§ęļ
íŽëĄŽ ę°ë°ė ëęĩŽė ėķë Ĩ ęē°ęģžëĨž ëĪė ėīíīëģīëĐī, ë°°ėī ėļėĪíīėĪė íëĄíží°ėļ __proto__
ę°ėēī ėė ë ëĪė __proto__
íëĄíží°ę° ėë ęēė íėļí ė ėëĪ.
ėīë prototype ę°ėēī ëí ë§ ę·ļëëĄ 'ę°ėēī'ėīęļ° ëëŽļėīëĪ.
ęļ°ëģļė ėžëĄ ëŠĻë ę°ėēīė __proto__
ėë Object.prototypeėī ė°ęē°ëëĪ.
var arr = [1, 2];
arr(.__proto__).push(3);
arr(.__proto__)(.__proto__).hasOwnProperty(2); // true
ë°ëžė, ėļėĪíīėĪë ę·ļ ėļėĪíīėĪė ėėąė íĻėė prototypeė ëĐėëëŋ ėëëž Object.prototypeė ëĐėëë ėė ė ęēėēëž ėŽėĐí ė ėëĪ.
ėëĩ ę°ëĨí __proto__
ëĨž í ëē ë ë°ëžę°ëĐī Object.prototypeė ė°ļėĄ°í ė ėęļ° ëëŽļėīëĪ.
ėīėēëž ėīëĪ ë°ėīí°ė __proto__
íëĄíží° ëīëķė ëĪė __proto__
íëĄíží°ę° ė°ėė ėžëĄ ėīėīė§ ęēė íëĄí íė
ėēīėļ
ėīëžęģ íëĪ.
ėī ėēīėļė ë°ëžę°ëĐ° ęēėíë ęēė íëĄí íė
ėēīėīë
ėīëžęģ íëĪ.
var arr = [1, 2];
Array.prototype.toString.call(arr); // 1,2
Object.prototype.toString.call(arr); // [ object Array ]
arr.toString(); // 1,2
arr.toString = function () {
return this.join("_");
};
arr.toString(); // 1_2
// cf. Object.prototype.toString() ė ėŽėĐė ė§ė ę°ėēīėė ėŽė ėëė§ ėėžëĐī [ object type ]ė return íëĪ.
ėīëĪ ėėąė íĻėėīë prototypeė ë°ëė ę°ėēīėīęļ° ëëŽļė Object.prototypeėī ėļė ë íëĄí íė
ėēīėļė ėĩėëĻė ėĄīėŽíëĪ.
ë°ëžė ę°ėēīėėë§ ėŽėĐí ëĐėëë ëĪëĨļ ėŽë ë°ėīí° íė
ėēëž íëĄí íė
ę°ėēī ėė ė ėí ė ėëĪ.
ę°ėēīėėë§ ėŽėĐí ëĐėëëĨž ę°ėēīę° ėë ë°ėīí° íė
ė ėŽėĐíëĐī ėĪëĨëĨž ëė§ëëĄ íīėž íëë° Object.prototypeė ėļė ë ëŠĻë íëĄí íė
ėēīėļė ėĩėëĻė ėĄīėŽíęļ° ëëŽļė ėīëĪ ë°ėīí° íė
ėīęąī ęą°ė ëŽīėĄ°ęąī íëĄí íė
ėēīėīëė íĩíī íīëđ ëĐėëė ė ę·ž
í ė ėęē ëęļ° ëëŽļėīëĪ.
ėī ę°ė ėīė ëĄ ę°ėēī ė ėĐ ëĐėëëĪė
Object.prototypeėī ėëëž Objectė ėĪííą ëĐėëëĄ ëķėŽëėī ėëĪ.
ex) Object.freeze(instance) (o) / instance.freeze() (x)
ë°ëëĄ Object.prototypeėë ėīëĪ ë°ėīí°ėėë íėĐí ė ėë ëēėĐė ėļ ëĐėëëĪë§ ėĄīėŽíëĪ.
ėėļė ėžëĄ Object.createëĨž ėīėĐíëĐī Object.prototypeė ëĐėëė ė ę·ží ė ėë ęē―ė°ë ėëĪ.
Object.create(null)ė__proto__
ę° ėë ę°ėēīëĨž ėėąíëĪ.var _proto = Object.create(null); _proto.getValue = function (key) { return this[key]; }; var obj = Object.create(_proto); obj.a = 1; console.log(obj.getValue("a")); // 1 console.dir(obj); // Ojbect // a: 1 // __proto__: // getValue: f (key)
objė
__proto__
ėë getValue ëĐėëë§ ėĄīėŽí ëŋ__proto__
ë° constructor íëĄíží°ę° ėĄīėŽíė§ ėëëĪ.
ėīë ęē ë§ëĪėīė§ ę°ėēīë ėžë°ė ėļ ë°ėīí°ėė ë°ëė ėĄīėŽíë ëīėĨ ëĐėë ë° íëĄíží°ëĪėī ė ęą°ëėī ęļ°ëģļ ęļ°ëĨė ė ė―ė ėęēžė§ë§ ę°ėēī ėėēīė ëŽīęēę° ę°ëēžėė ļ ėąëĨėą ėīė ė ę°ė§ëĪ.
ëę°ė ė __proto__
ëĨž ė°ęē°íīëę°ęļ°ë§ íëĐī ëŽīíëëĄ íëĄí íė
ėēīėļ ęīęģëĨž ėīėīëę° ė ėëĪ.
__proto__
ę° ė°ļėĄ°íë ëė(ėĶ, ėėąė íĻėė prototype)ėī, ė°ęē°íęģ ė íë 'ėė ėėąė íĻėė ėļėĪíīėĪ'ëĨž ë°ëžëģīëëĄ
íīėĢžëĐī ëëĪ.
var Grade = function () {
var args = Array.prototype.slice.call(arguments);
for (var i = 0; i < arguments.length; i++) {
this[i] = args[i];
}
this.length = args.length;
};
var g = new Grade(100, 80);
ëģė gėë Grade ėėąė íĻėė ėļėĪíīėĪę° ëīęēĻ ėëë°, ėīë ė ėŽë°°ėīę°ėēīėīëĪ.
ė ėŽë°°ėīę°ėēīė ë°°ėī ëĐėëëĨž ė ėĐíë Īęģ íëĪ.
ėēŦ ëēėŽ ë°ĐëēėžëĄ call/apply ëĐėëëĨž ėŽėĐí ė ėëĪ.
var arr2 = Array.prototype.push.call(g, 60);
console.log(arr2); // [100, 80, 60]
ë ëēė§ļ ë°ĐëēėžëĄ ėė ėļėĪíīėĪėė ë°°ėī ëĐėëëĨž ė§ė ėļ ė ėęēë í ė ėëĪ.
ėī ęē―ė° ë°°ėī ëĐėëëĨž ėŽėĐíęļ° ėíī ė°ęē°ėī íėí ėė ėėąė íĻėë Array() ėīëŊëĄ ëĪėęģž ę°ė ė―ëëĨž ėķę°íëĪ.
ėėąė íĻė Gradeė prototypeėī ë°°ėīė ėļėĪíīėĪëĨž ë°ëžëģīëëĄ í ęēėīëĪ.
var Grade = function () {
var args = Array.prototype.slice.call(arguments);
for (var i = 0; i < arguments.length; i++) {
this[i] = args[i];
}
this.length = args.length;
};
Grade.prototype = []; // ėļėĪíīėĪ ėėą ė ė ėķę°íīėž íëĪ
var g = new Grade(100, 80);
g.pop();
console.log(g); // Grade(1) [100]