ECMAScript5新特性之对象篇

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

发布了60 篇原创文章 · 获赞 22 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章