码迷,mamicode.com
首页 > 其他好文 > 详细

ECMAScript5新特性之对象篇

时间:2015-02-06 19:03:02      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:ecmascript   object   

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


本文出自 “Eason's hcc” 博客,请务必保留此出处http://hcc0926.blog.51cto.com/172833/1612439

ECMAScript5新特性之对象篇

标签:ecmascript   object   

原文地址:http://hcc0926.blog.51cto.com/172833/1612439

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!