1、Ojbect.create(O[,properties]):
var Person = { name : ‘hcc‘, hungry : false, play : function (){ this.hungry = true; return ‘I am playing!‘; }, speak : function () { return ‘I am speaking!‘; } }; var p = Object.create(Person);
我们发现这样创建对象的方式更加简化,以前是怎么创建呢,我们先回忆一下:
function Person(name) { this.name = name; this.hungry = false; } Person.prototype = { constructor : Person, play : function () { this.hungry = true; return ‘I am playing!‘; }, speak : function () { return ‘I am speaking!‘; } };
还很熟悉吧。当然,这种创建对象的方式还可以简化,形式如下:
var p = Object.create({ name : ‘hcc‘, hungry : false, play : function () { this.hungry = true; return ‘I am playing!‘; }, speak : function () { return ‘I am speaking!‘; } }); console.info(p);
2、Object.defineProperty
当然也可以配置该对象的单个属性,并且可以配置属性的特性,比如说,writeable,enumable,configuable, get ,set
Object.defineProperty( p, "age", { value: 24, // p.age = 24 writable: false, //This perperty is not allowd to be writen. enumerable: true, configurable: true });
访问该对象的age可以通过
console.info(p.age);
如你想象的一样,显示为24.如果我们想设置这个属性的值呢?
p.age = "33"; console.info(p.age);
结果是33吗?你可以把上面的代码拷贝到ff的控制台中运行下,结果并非你所愿,结果还是原始值24,
原因就是将该属性的writeable(Defaults to false
)设置成了false,如果在设计是允许改变其值,可以改成true。我们再看下别的属性:
configurable : 如果为false,writeable,enumerable将不起作用。Defaults to false
enumerable : 如果为true,可以使用for (var prop in obj){}进行遍历。Defaults to
false
再看下get,set的用法:
var Dog = { name : ‘dog‘ }; 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; console.info(dog.humanYears);
当执行到dog.age = 2时,就调用set方法。
3、Ojbect.defineProperties
该方法可以给对象一次性定义多个属性,
var obj = {}; Object.defineProperties(obj, { "value": { value: true, writable: false }, "name": { value: "John", writable: false } });
4、Other Feature
(1)Object.getOwnPropertyDescriptor(): 获得对象自身的属性描述(value,configure,writeable等),不包括动态添加的:
var Dog = { name : ‘dog‘ }; Dog.age = "123"; Object.getOwnPropertyDescriptor(Dog, "name"); Object.getOwnPropertyDescriptor(Dog, "123");
(2)Object.keys
获得对象的key值:
var obj = { name: "hcc", age: "http://ejohn.org/", address : "xi‘an" }; console.info(Object.keys(obj).join(","));
另:Object.keys基本等同于Object.getOwnPropertyNames(),后者返回的是字符串数组,前者返回的是对象的属性。
(3)Object.seal() and Object.isSealed()
seal的英文意思是“密封,封条”的意思。在这里就是阻止代码修改或删除对象的描述、增加属性、。功能基本等同Object.freeze()和
Object.isFrozen(),只不过这两个方法使得属性不可编辑。
(4)检测是否是动态增加的对象
var obj = {}; obj.name = "hcc"; console.info(obj.name); console.info(Object.isExtensible(obj));//检测是否是扩展的 Object.preventExtensions(obj);//阻止其扩展属性 console.info(Object.isExtensible(obj));//重新检测 obj.age = 23; console.info(obj.age);
通过运行代码可以发现,当设置阻止对象扩展属性后,重新设置age属性,将不再起作用,所以obj.age的属性为undefined。
好了。ES5的基本特性就基本介绍完了,有问题请留言。