锁定老帖子 主题:ECMAScript5 新特性(一)
精华帖 (1) :: 良好帖 (4) :: 新手帖 (12) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-23
最后修改:2011-01-23
Function 1: Object.create这是一个很重要的改动,现在我们终于可以得到一个原型链干净的对象了。以前要创建一个类
function Cat(name) { this.name = name; this.paws = 4; this.hungry = false; this.eaten = []; } Cat.prototype = { constructor : Cat, play : function () { this.hungry = true; return 'playing!'; }, feed : function (food) { this.eaten.push(food); this.hungry = false; }, speak : function () { return 'Meow'; } }; 必须要分两步走,但是现在可以不必了
var Dog = { name : 'dog', paws : 4, hungry : false, eaten : null, play : function () { this.hungry = true; return 'playing!'; }, speak : function () { return 'Woof!'; } }; var dog = Object.create(Dog); Object.create他还有第2个参数,是一个properties descriptor object ,关于这方面的详细解释,请看第2点。
另外:如果浏览器不支持Object.create,可以用这种方法代替
if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {} F.prototype = o; return new F(); }; } Browser Support
○ Firefox 4 ○ Internet Explorer 9 ○ Safari 5 ○ Chrome 5+
Function 2: Object.defineProperty
如果你想为一个对象定义属性,那么就必须my_dog.age = 2; 用这种方法。但是在ECMAScript5中,提供了更好的包装方法Object.defineProperty Parameters: 1.对象引用 2.属性名 3.修饰对象 修饰对象中的定义如下: ● value:
use this to set the value of a property. Defaults
to ● writable:
use this boolean to define whether this is a read-only variable. If
it’s writable, it’s ● configurable:
use this boolean to define whether the type (value vs. method) of
this property can be changed, or whether the property can be deleted.
If it’s configurable, it’s ● enumerable:
use this boolean to define whether this property is included when the
properties of the object are enumerated (a for-in
loop
or the keys method). Defaults to ● get:
use this to define a custom getter method. Defaults to ● set:
use this to define a custom setter method. Defaults to
Sample:
var Dog = { name : 'dog', paws : 4 }; var dog = Object.create(Dog); Object.defineProperty(dog, 'age', { set : function (age) { this.humanYears = age * 7; }, get : function () { return this.humanYears / 7; }, enumerable : true }); dog.age = 2; dog.humanYears; // 14 以上代码让age和humanYears保存了同步,如果你不想对外界暴露humanYears,可以这样使用闭包:
Object.defineProperty(dog, 'age', (function () { var humanYears; return { set : function (age) { humanYears = age * 7; }, get : function () { return humanYears / 7; }, enumerable : true }; }())); 当然,也可以用在Object.create方法上面
var yourDog = Object.create(Dog, { age : { get : function () { /* . . . */ }, set : function () { /* . . . */ }, enumerable: true }, gender : { value : 'female' } }); Browser Support
○ Firefox 4 ○ Internet Explorer 9 ○ Safari 5 ○ Chrome 5+
Function 3: Object.defineProperties当然,如果你想像Object.create方法那样一口气给对象加入很多属性的话,你可以用Object.defineProperties方法
Object.defineProperties(dog, { age : { get : function () { /* . . . */ }, set : function () { /* . . . */ }, enumerable: true }, gender : { value : 'female' } }); 注意区别 Object.create和Object.defineProperties第一个参数的不同,Object.create是prototype,而Object.defineProperties是对象
Browser Support ○ Firefox 4 ○ Internet Explorer 9 ○ Safari 5 ○ Chrome 5+
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-24
ECMAScript最新的标准不是3?
|
|
返回顶楼 | |
发表时间:2011-01-24
2010年12月开始,标准由3升级到5。4由于某些原因胎死腹中
|
|
返回顶楼 | |
发表时间:2011-01-24
rainsilence 写道 2010年12月开始,标准由3升级到5。4由于某些原因胎死腹中
悲剧,可怜的4,穿越了。 标准上个月才升级,那到浏览器支持还有的等呢,说不定5也会胎死腹中 |
|
返回顶楼 | |
发表时间:2011-01-24
新的类定义语法好像确实亲和了一点
以前用构造函数+原型链的方法要分2步走。用动态原型又不支持继承。相当麻烦,一般只好引入第三方框架。现在可以一步到位了还是不错的。 但是要等到浏览器支持估计还是要比较久的。 |
|
返回顶楼 | |
发表时间:2011-01-24
我在每个特性的下面都给出了浏览器支持的情况。其实现在已经普及了
|
|
返回顶楼 | |
发表时间:2011-01-24
Browser Support
○ Firefox 4 ○ Internet Explorer 9 ○ Safari 5 ○ Chrome 5+ 哥哥,您的文章我仔细看了才回帖的。这些浏览器真的普及了吗。程序员用的多,不代表用户普及了。何况这些浏览器,就是在程序员群体中恐怕也不能说普及了。 |
|
返回顶楼 | |
发表时间:2011-01-24
至少不会走4的旧路了。
|
|
返回顶楼 | |
发表时间:2011-01-24
学习新知识!希望IE6早点消失。
|
|
返回顶楼 | |
发表时间:2011-01-24
IE6应该让广大的程序员,全都抵制,从此开发不支持IE6的程序
|
|
返回顶楼 | |