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的基本特性就基本介绍完了,有问题请留言。