虽说如今并非全部的浏览器都已经支持ECMAScript5的新特性,但相比于ECMAScript4而言ECMAScript5被广大浏览器厂商普遍接受,目前主流的浏览器中只有低版本的IE不支持,其它都或多或少的支持了ECMAScript5的新特性,其中重中之重天然是一切对象的基类型——Objectjava
这个方法用于建立一个对象,并把其prototype属性赋值为第一个参数,同时能够设置多个descriptors,关于decriptor下一个方法就会介绍这里先不说。只须要这样就能够建立一个原型链干净对象了数组
var o = Object.create({ "say": function () { alert(this.name); }, "name":"Byron" });
想明白这两个函数必须明白descriptor是什么,在以前的JavaScript中对象字段是对象属性,是一个键值对,而在ECMAScript5中引入property,property有几个特征浏览器
1. value:值,默认是undefined函数
2. writable:是不是只读property,默认是false,有点像C#中的constthis
3. enumerable:是否能够被枚举(for in),默认falsespa
4. configurable:是否能够被删除,默认falseprototype
一样能够像C#、Java同样些get/set,不过这两个不能和value、writable同时使用设计
5.get:返回property的值得方法,默认是undefinedcode
6.set:为property设置值的方法,默认是undefined对象
Object.defineProperty(o,'age', { value: 24, writable: true, enumerable: true, configurable: true }); Object.defineProperty(o, 'sex', { value: 'male', writable: false, enumerable: false, configurable: false }); console.log(o.age); //24 o.age = 25; for (var obj in o) { console.log(obj + ' : ' + o[obj]); /* age : 25 //没有把sex : male 遍历出来 say : function () { alert(this.name); } name : Byron */ } delete o.age; console.log(o.age);//undefined console.log(o.sex); //male //o.sex = 'female'; //Cannot assign to read only property 'sex' of #<Object> delete o.age; console.log(o.sex); //male ,并无被删除
也可使用defineProperties方法同时定义多个property,
Object.defineProperties(o, { 'age': { value: 24, writable: true, enumerable: true, configurable: true }, 'sex': { value: 'male', writable: false, enumerable: false, configurable: false } });
这个方法用于获取defineProperty方法设置的property 特性
var props = Object.getOwnPropertyDescriptor(o, 'age'); console.log(props); //Object {value: 24, writable: true, enumerable: true, configurable: true}
获取全部的属性名,不包括prototy中的属性,返回一个数组
console.log(Object.getOwnPropertyNames(o)); //["age", "sex"]
例子中能够看到prototype中的name属性没有获取到
和getOwnPropertyNames方法相似,可是获取全部的可枚举的属性,返回一个数组
console.log(Object.keys(o)); //["age"]
上面例子能够看出不可枚举的sex都没有获取的到
方法用于锁住对象属性,使其不可以拓展,也就是不能增长新的属性,可是属性的值仍然能够更改,也能够把属性删除,Object.isExtensible用于判断对象是否能够被拓展
console.log(Object.isExtensible(o)); //true o.lastName = 'Sun'; console.log(o.lastName); //Sun ,此时对象能够拓展 Object.preventExtensions(o); console.log(Object.isExtensible(o)); //false o.lastName = "ByronSun"; console.log(o.lastName); //ByronSun,属性值仍然能够修改 //delete o.lastName; console.log(o.lastName); //undefined仍可删除属性 o.firstname = 'Byron'; //Can't add property firstname, object is not extensible 不可以添加属性
方法用于把对象密封,也就是让对象既不能够拓展也不能够删除属性(把每一个属性的configurable设为false),单数属性值仍然能够修改,Object.isSealed因为判断对象是否被密封
Object.seal(o); o.age = 25; //仍然能够修改 delete o.age; //Cannot delete property 'age' of #<Object>
终极神器,彻底冻结对象,在seal的基础上,属性值也不能够修改(每一个属性的wirtable也被设为false)
Object.freeze(o); o.age = 25; //Cannot assign to read only property 'age' of #<Object>
上面的代码都是在Chrome 29下一严格模式(’use strict’)运行的,并且提到的方法都是Object的静态函数,也就是在使用的时候应该是Object.xxx(x),而不能以对象实例来调用。整体来讲ES5添加的这些方法为javaScript面向对象设计提供了进一步的可配置性,用起来感受很不错。