对象属性的访问控制
Object.getOwnPropertyDescriptor( obj, prop )
Object.defineProperty( obj, prop, desc )
Object.defineProperties( obj, props )
desc = {
value: true,
writable: false, //修改
enumerable: true, //for in
configurable: true, //删除和修改属性
get: function(){ return name; },
set: function(value){ name = value; }
}
约翰同学的讲解:http://ejohn.org/blog/ecmascript-5-objects-and-properties/
支持:无
替代/过渡:Object.defineProperties其实相当于jQuery.extend,用来实现Mixin
ECMAScript 5 Getters and Setters
python和ruby里都有的属性访问方法
obj = {
get innerHTML() { return …; },
set innerHTML(newHTML) { … }
};
支持:Firefox 2.0+, Safari 3.0+, Google Chrome 1.0+, Opera 9.5+
替代/过渡:
非标准,Firefox1.5里的旧方法
HTMLElement.prototype.__defineGetter__("innerHTML", function () {});
HTMLElement.prototype.__defineSetter__("innerHTML", function (val) {});
支持:Firefox 2.0+, Safari 3.0+, Google Chrome 1.0+, Opera 9.5+
标准
Object.defineProperty(document.body, "innerHTML", { get : function () {} });
MSDN文档:http://msdn.microsoft.com/en-us/library/dd229916(VS.85).aspx
支持:IE8+ (只能对DOM使用)
ECMAScript 5 Strict Mode
ES5的严格模式,删除了旧版本中容易引起问题的元素,并且会显式的报错,方便调试
"use strict"; //以下情况下抛出异常
//对未定义的变量赋值
//操作被设置为不可写,不可配置或不可扩充的属性
//删除变量,函数,参数
//在对象直接量里重复定义属性
//eval做关键字,在eval的字符串里定义变量
//覆写arguments
//使用arguments.caller和arguments.callee(匿名函数必须具名才能引用自己)
//(function(){ ... }).call( null ); // Exception
//使用with
约翰同学的讲解:http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
支持:无
替代/过渡:……从现在开始养成严谨的编程习惯
ECMAScript 5 其他新特性
传递函数的引用时,绑定this
Function.prototype.bind(thisArg, arg1, arg2....) /
支持:无
替代/过渡:prototype http://www.prototypejs.org/api/function/bind
ISO-formatted dates
Date.prototype.toISOString() // Prints 2009-05-21T16:06:05.000TZ
支持:无
替代/过渡:datejs http://code.google.com/p/datejs/
String.prototype.trim()
支持:Firefox3.5
替代/过渡:各种正则实现 http://blog.stevenlevithan.com/archives/faster-trim-javascript
===================废话又开始的分割线=======================
其实我把这个东西发出来是希望能促进创新的氛围,让更多人认识到很多新技术已经进入到“实用”阶段。
如果只是想做个实验性的webgame,或是只能用于特定平台的应用(比如iphone,greasemonkey),firefox3.5+webkit的支持就已经足够罢。
如果不能无视主流平台,有很多技术能让你gracefully degrade(优雅的退化)或者选取不同的方法实现兼容的接口。
如果你等不及IE x在若干年后实现xx,希望提前享受福利,有些技术的设计原则就是让你能在没有native支持的情况下可以自己实现一模一样的功能或语法糖(syntactic sugar),比如ES5对象的继承和访问控制,从ES4/ActionScript3时期那些老土的关键词(class extands private static)改成了Object.create(p, attrs).defineProperty(o, n, attrs).defineProperties(o, attrs).freeze().getOwnPropertyNames().map(fn),不会只是为了酷炫罢……
很多人都喜欢抱怨“我这辈子都没机会用HTML5”,但是只要把视线从自己脚下那巴掌大块地移开看看别处,会发现世界其实一直都在改变喔XD