ECMAScript 5ã¯ç¬èªã®æ¹æ³ã§æ©èœããŸãã ECMAScript 3.1ã«çµã蟌ãŸããECMAScript 4ã®ç°ãã埩掻ããŸãããããã¯åŸã«ECMAScript 5ïŒ
詳现 ïŒãšåŒã°ããæãããECMAScript 3ã«åºã¥ããŠæ§ç¯ãããæ°ããæ©èœå±€ãåããŠããŸãã
ä»æ§ã«å«ãŸããããã€ãã®æ°ããAPIãçºè¡šããŸããããæãèå³æ·±ãæ©èœã¯ãªããžã§ã¯ããšããããã£ã®ã³ãŒãã«ãããŸãã ãã®æ°ããã³ãŒãã«ããããŠãŒã¶ãŒããªããžã§ã¯ããæäœããæ¹æ³ã«å€§ããªåœ±é¿ãäžããããšãã§ããã²ãã¿ãŒãšã»ãã¿ãŒãæäŸãããªã¹ããæäœããŸãã¯åé€ãé²ããããã«æ°ããããããã£ã®è¿œå ãé²ãããšãã§ããŸãã èŠããã«ãJavaScriptã䜿çšããŠïŒä»ã®ãã®ãäžå䜿çšããã«ïŒæ¢åã®JavaScript APIïŒDOMãªã©ïŒã®ã»ãããè€è£œããã³æ¡åŒµã§ããŸãã
éåžžã«è¯ããã¥ãŒã¹ïŒãããã®æ©èœã¯ããã¹ãŠã®äž»èŠãªãã©ãŠã¶ãŒã«è¡šç€ºãããã¯ãã§ãã ãã¹ãŠã®äž»èŠãªãã©ãŠã¶ãã³ããŒããã®ä»æ§ã«åãçµã¿ã補åã«å®è£
ããããšã«åæããŠããŸãã æ£ç¢ºãªæ¥ä»ã¯ãŸã æ確ã§ã¯ãããŸããããæ©æã«å®è£
ãããå¯èœæ§ã¯é«ããªããŸãã
ã©ããããä»æ¥ã®ES5ã®å®å
šãªå®è£
ã¯ãããŸããããããã€ãã®ãããžã§ã¯ããæ¢ã«å®è£
ã®ããã»ã¹ã«ãããŸãã åæã«ã
ECMAScript 5ä»æ§ ïŒPDF-ãã®èšäºã§ã¯107ã109ããŒãžã«ã€ããŠèª¬æããŸãïŒãèªãããGoogleã§ECMAScriptããŒã ã®
ææ°ã®è°è«ãèŠãããšãã§ããŸãã
泚ïŒãããã®ã¡ãœããã®ç°¡åãªãµã³ãã«å®è£
ãããã€ã瀺ããŠãããããã©ã®ããã«æ©èœãããã説æããŸãã ãããã®ã»ãšãã©ãã¹ãŠããæ£ããæäœã®ããã«ä»ã®æ°ããæ¹æ³ãå¿
èŠãšããŸã-ãããŠããããã¯ä»æ§100ïŒ
ã«åŸã£ãŠå®è£
ãããŠããŸããïŒããšãã°ããšã©ãŒãã§ãã¯ã¯ãããŸããïŒã
ãªããžã§ã¯ã
ECMAScript 5ã®æ°æ©èœ-ãªããžã§ã¯ãã®æ¡åŒµæ§ãåãæ¿ããããšãã§ããããã«ãªããŸããã æ¡åŒµæ§ãç¡å¹ã«ãããšããªããžã§ã¯ãã«æ°ããããããã£ãè¿œå ã§ããªããªããŸãã
ES5ã¯ããªããžã§ã¯ãã®æ¡åŒµæ§ãæäœããã³æ€èšŒãã2ã€ã®æ¹æ³ãæäŸããŸãã
Object.preventExtensionsïŒobjïŒãObject.isExtensibleïŒobjïŒ
preventExtensions
ã¯ãªããžã§ã¯ãããããã¯ããå°æ¥ã®æ°ãããªããžã§ã¯ãããããã£ã®äœæãé²ããŸãã
isExtensible
ãªããžã§ã¯ããçŸåšå±éäžãã©ãããå€æããæ©èœã
䜿çšäŸïŒ
var obj = {};
obj.name = "John" ;
print( obj.name );
// John
print( Object.isExtensible( obj ) );
// true
Object.preventExtensions( obj );
obj.url = "http://ejohn.org/" ; // Exception in strict mode
print( Object.isExtensible( obj ) );
// false
* This source code was highlighted with Source Code Highlighter .
ããããã£ãšèšè¿°å
ããããã£ã¯å®å
šã«æ¹èšãããŸããã ãããã¯ãªããžã§ã¯ãã«é¢é£ä»ããããåçŽãªæå³ã§ã¯ãªããªããŸãããããªãã¯ä»ãããããã©ã®ããã«åäœããããå®å
šã«å¶åŸ¡ã§ããŸãã ãã ãã匷床ãé«ãã»ã©ãè€éããå¢ããŸãã
ãªããžã§ã¯ãã®ããããã£ã¯2ã€ã®éšåã«åãããŠããŸãã
ããããã£ã®ã³ã³ãã³ãã¯2ã€ã®æ¹æ³ã§å®çŸ©ã§ããŸãïŒå€ïŒããããã£ããŒã¿ã¯ECMAScript 3ã§ç§ãã¡ãç¥ã£ãŠãããæããäŒçµ±çãªããããã£ã§ãïŒãŸãã¯ã²ãã¿ãŒãšã»ãã¿ãŒïŒããããã£ã¯ãã¢ã¯ã»ãµãŒãã§ã-WebKitãªã©ã®ããã€ãã®ææ°ãã©ãŠã¶ãŒããç¥ã£ãŠããŸãïŒãšã€ã¢ãªã
- äŸ¡å€ ããããã£ã®å€ãæ ŒçŽããŸãã
- ã²ããã ãã®é¢æ°ã¯ãããããã£å€ã«ã¢ã¯ã»ã¹ãããã³ã«åŒã³åºãããŸãã
- ã»ããã ãã®é¢æ°ã¯ãããããã£å€ãå€æŽããããã³ã«åŒã³åºãããŸãã
ããã«ãããããã£ã¯...
- å¯å€ã falseã®å Žåããã®ããããã£ã®å€ã¯å€æŽã§ããŸããã
- èšå®å¯èœã falseã®å Žåãããããã£ã®åé€ãŸãã¯ãã®å±æ§ïŒæžã蟌ã¿å¯èœæ§ãæ§æå¯èœæ§ããŸãã¯åæïŒã®å€æŽã¯å€±æããŸãã
- åæã trueã®å ŽåããŠãŒã¶ãŒã
for (var prop in obj)
ïŒãŸãã¯ãã®ãããªãã®for (var prop in obj)
å®è¡ãããšãããããã£ãå埩ãããŸãã
åèšãããšããããã®ããŸããŸãªå±æ§ãããããã£èšè¿°åãæ§æããŸãã ããšãã°ãåçŽãªèšè¿°åã¯æ¬¡ã®ããã«ãªããŸãã
{
value: "test" ,
writable: true ,
enumerable: true ,
configurable: true
}
* This source code was highlighted with Source Code Highlighter .
3ã€ã®å±æ§ïŒæžã蟌ã¿å¯èœãââåæå¯èœãæ§æå¯èœïŒã¯ãªãã·ã§ã³ã§ããããã¹ãŠããã©ã«ãã§trueã§ãã ãããã£ãŠãããããã£ã®å Žåã¯ãå€ããŸãã¯ã²ãã¿ãŒãšã»ãã¿ãŒã®ããããã®ã¿ãæäŸããå¿
èŠããããŸãã
æ°ãã
Object.getOwnPropertyDescriptor
ã¡ãœããã䜿çšããŠãæ¢åã®
Object.getOwnPropertyDescriptor
ããããã£ã«é¢ãããã®æ
å ±ãååŸã§ããŸãã
Object.getOwnPropertyDescriptorïŒobjãpropïŒ
ãã®ã¡ãœããã¯ãããããã£èšè¿°åãžã®ã¢ã¯ã»ã¹ãèš±å¯ããŸãã ããã¯ããã®æ
å ±ãååŸããå¯äžã®æ¹æ³ã§ãïŒèšãæãããšãèšè¿°åã¯ãŠãŒã¶ãŒã®èªç±ã§ã¯ãããŸãããèšè¿°åã¯ããããã£ã®å¯èŠå±æ§ãšããŠååšãããECMAScriptãšã³ãžã³ã«å
éšçã«ä¿åãããŸãïŒã
䜿çšäŸïŒ
var obj = { foo: "test" };
print(JSON.stringify(
Object.getOwnPropertyDescriptor( obj, "foo" )
));
// {"value": "test", "writable": true,
// "enumerable": true, "configurable":true}
* This source code was highlighted with Source Code Highlighter .
ã¡ãœããObject.definePropertyïŒobjãpropãdescïŒ
ãã®ã¡ãœããã䜿çšãããšããªããžã§ã¯ãã®æ°ããããããã£ãå®çŸ©ïŒãŸãã¯æ¢åã®ããããã£ã®ãã³ãã«ãå€æŽïŒã§ããŸãã ãã®ã¡ãœããã¯ããããã£èšè¿°åãååŸããããã䜿çšããŠããããã£ãåæåïŒãŸãã¯æŽæ°ïŒããŸãã
䜿çšäŸïŒ
var obj = {};
Object.defineProperty( obj, "value" , {
value: true ,
writable: false ,
enumerable: true ,
configurable: true
});
( function (){
var name = "John" ;
Object.defineProperty( obj, "name" , {
get: function (){ return name; },
set: function (value){ name = value; }
});
})();
print( obj.value )
// true
print( obj.name );
// John
obj.name = "Ted" ;
print( obj.name );
// Ted
for ( var prop in obj ) {
print( prop );
}
// value
// name
obj.value = false ; // Exception if in strict mode
Object.defineProperty( obj, "value" , {
writable: true ,
configurable: false
});
obj.value = false ;
print( obj.value );
// false
delete obj.value; // Exception
* This source code was highlighted with Source Code Highlighter .
Object.definePropertyã¯ãECMAScriptã®æ°ããããŒãžã§ã³ã®åºæ¬ã¡ãœããã§ãã å®è³ªçã«ä»ã®ãã¹ãŠã®éèŠãªæ©èœã¯ããã®ã¡ãœããã®ååšã«äŸåããŠããŸãã
Object.definePropertiesïŒobjãpropsïŒ
ïŒãããããåå¥ã«å®çŸ©ãã代ããã«ïŒãªããžã§ã¯ãã®ããããã£ãäžåºŠã«ããã€ãå®çŸ©ããŸãã
ãµã³ãã«å®è£
ïŒ
Object.defineProperties = function ( obj, props ) {
for ( var prop in props ) {
Object.defineProperty( obj, prop, props[prop] );
}
};
* This source code was highlighted with Source Code Highlighter .
䜿çšäŸïŒ
var obj = {};
Object.defineProperties(obj, {
"value" : {
value: true ,
writable: false
},
"name" : {
value: "John" ,
writable: false
}
});
* This source code was highlighted with Source Code Highlighter .
ããããã£èšè¿°åïŒããã³é¢é£ããã¡ãœããïŒã¯ãããããECMAScript 5ã®æãéèŠãªæ°æ©èœã§ããããã«ãããéçºè
ã¯ãªããžã§ã¯ããéåžžã«æ£ç¢ºã«å¶åŸ¡ããäžèŠãªå€æŽãé²ããåäžã®WebäºæAPIããµããŒãã§ããŸãã
æ°æ©èœ
äžèšã®æ¡åŒµæ©èœã䜿çšããŠãããã€ãã®èå³æ·±ãæ°æ©èœãèšèªã«å°å
¥ãããŸããã
次ã®2ã€ã®ã¡ãœããã¯ããªããžã§ã¯ãã®ãã¹ãŠã®ããããã£ã®é
åãåéããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã
Object.keysïŒobjïŒ
ãªããžã§ã¯ãã®ãã¹ãŠã®åæããããã£ã®ååãè¡šãæååã®é
åãè¿ããŸãã ãã®åäœã¯ãPrototype.jsã©ã€ãã©ãªã®ã¡ãœããã®åäœãšäžèŽããŸãã
ãµã³ãã«å®è£
ïŒ
Object.keys = function ( obj ) {
var array = new Array();
for ( var prop in obj ) {
array.push( prop );
}
return array;
};
* This source code was highlighted with Source Code Highlighter .
䜿çšäŸïŒ
var obj = { name: "John" , url: "http://ejohn.org/" };
print( Object.keys(obj).join( ", " ) );
// name, url
* This source code was highlighted with Source Code Highlighter .
Object.getOwnPropertyNamesïŒobjïŒ
Object.keysãšã»ãŒåãã§ãããåæããããã®ã ãã§ãªãããªããžã§ã¯ãã®ãã¹ãŠã®ããããã£ã®ååãè¿ããŸãã
åæã§ããªãããããã£ã¯ãªã¹ãã§ããªããããECMAScript 3ã§å®è£
äŸãè¡ãããšã¯ã§ããŸããã æ»ãå€ãšäœ¿çšæ³ã¯Object.keysãšåãã§ãã
Object.createïŒããããããããïŒ
ãããã¿ã€ãããããã§ãããããããã£ãObject.definePropertiesïŒpropsïŒã䜿çšããŠèšå®ãããæ°ãããªããžã§ã¯ããäœæããŸãã
ç°¡åãªå®è£
ã¯æ¬¡ã®ããã«ãªããŸãïŒæ°ããObject.definePropertiesã¡ãœãããå¿
èŠã§ãïŒã
Object.create = function ( proto, props ) {
var obj = new Object();
obj.__proto__ = proto;
if ( typeof props !== "undefined" ) {
Object.defineProperties( obj, props );
}
return obj;
};
* This source code was highlighted with Source Code Highlighter .
泚ïŒäžèšã®ã³ãŒãã¯ãMozillaåºæã®_proto_ããããã£ã䜿çšããŠããŸãã ãã®ããããã£ã䜿çšãããšããªããžã§ã¯ãã®å
éšãããã¿ã€ãã«ã¢ã¯ã»ã¹ã§ããŸãããŸãããã®å€ãèšå®ã§ããŸãã ES5ã§ã¯ãObject.getPrototypeOfã¡ãœããã䜿çšããŠãã®ããããã£ã«ã¢ã¯ã»ã¹ã§ããŸãããã€ã³ã¹ããŒã«ã¯ã§ããŸããããããã£ãŠãäžèšã®ã¡ãœããã¯ESãšäºææ§ã®ããäžè¬çãªæ¹æ³ã§ã¯å®è£
ã§ããŸããã
以åã«Object.getPrototypeOfã«ã€ããŠèª¬æãããããããã§ã¯å床説æããŸããã
䜿çšäŸïŒ
function User(){}
User.prototype.name = "Anonymous" ;
User.prototype.url = "http://google.com/" ;
var john = Object.create( new User(), {
name: { value: "John" , writable: false },
url: { value: "http://google.com/" }
});
print( john.name );
// John
john.name = "Ted" ; // Exception if in strict mode
* This source code was highlighted with Source Code Highlighter .
Object.sealïŒobjïŒãObject.isSealedïŒobjïŒ
ãªããžã§ã¯ããå°å°ãããšãã³ãŒãããªããžã§ã¯ãã®ããããã£ã®èšè¿°åãåé€ãŸãã¯å€æŽã§ããªããªããæ°ããããããã£ãè¿œå ãããªããªããŸãã
å®è£
äŸïŒ
Object.seal = function ( obj ) {
var props = Object.getOwnPropertyNames( obj );
for ( var i = 0; i < props.length; i++ ) {
var desc = Object.getOwnPropertyDescriptor( obj, props[i] );
desc.configurable = false ;
Object.defineProperty( obj, props[i], desc );
}
return Object.preventExtensions( obj );
};
* This source code was highlighted with Source Code Highlighter .
æ¢åã®ããããã£ã®ã»ããããã®ãŸãŸæ®ããæ°ããè¿œå ãæäŸããã«ãåæã«ãŠãŒã¶ãŒãå€ãç·šéã§ããããã«ããå Žåã¯ããªããžã§ã¯ããã·ãŒã«ããããšããå§ãããŸãã
Object.freezeïŒobjïŒãObject.isFrozenïŒobjïŒ
ãªããžã§ã¯ãã®ããªãŒãºã¯ã·ãŒãªã³ã°ãšã»ãŒåãã§ãããããããã£ãå€æŽãããªããšããè¿œå ããããŸãã
å®è£
äŸïŒ
Object.freeze = function ( obj ) {
var props = Object.getOwnPropertyNames( obj );
for ( var i = 0; i < props.length; i++ ) {
var desc = Object.getOwnPropertyDescriptor( obj, props[i] );
if ( "value" in desc ) {
desc.writable = false ;
}
desc.configurable = false ;
Object.defineProperty( obj, props[i], desc );
}
return Object.preventExtensions( obj );
};
* This source code was highlighted with Source Code Highlighter .
ãªããžã§ã¯ãã®åçµã¯ãããã¯ã®ç©¶æ¥µã®åœ¢ã§ãã ãªããžã§ã¯ããåçµããåŸã¯ã解åããããšã¯ã§ããŸãããã©ã®ãããªåœ¢ã§ãå€æŽããããšã¯ã§ããŸããã ããã¯ããªããžã§ã¯ããç¡æéã«æ£ç¢ºã«æ®ãããŸãŸã«ããããã®æè¯ã®æ¹æ³ã§ãã
åãããŠããããã®å€æŽã¯éåžžã«èå³æ·±ããã®ã§ãããäœæãããªããžã§ã¯ããåäŸã®ãªãã¬ãã«ã§å¶åŸ¡ã§ããŸãã åªããç¹ã¯ããããã®æ©èœã䜿çšããŠãçŽç²ãªECMAScriptã§ãã倧ããè€éãªé¢æ°ãäœæã§ããããšã§ãïŒæ°ããDOMã¢ãžã¥ãŒã«ã®æ§ç¯ãã»ãšãã©ã®ãã©ãŠã¶ãŒAPIã®çŽç²ãªJavaScriptãžã®ç§»åãªã©ïŒã ãŸãããã¹ãŠã®ãã©ãŠã¶ã«ã¯JavaScriptãæèŒãããŠãããããããã絶察ã«æ¥œãã¿ã§ãã
-翻蚳è
泚ïŒèšè¿°åã¯èšè¿°åãšããŠç¿»èš³ãããŸãããèšè¿°åãšããŠç¿»èš³ããããšãã§ããŸãã ã²ãã¿ãŒãšã»ãã¿ãŒã«ã¯ããã·ã¢èªã§åãçããŠå®¹éã®ããå®çŸ©ïŒå€ã®åä¿¡è
ãšå€ã®ã€ã³ã¹ããŒã©ãŒïŒããªããããå°éçšèªã®ã²ãã¿ãŒãšã»ãã¿ãŒã䜿çšãããŸãã