Object对象

JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象。Object本身也是一个构造函数,可以直接通过它来生成新对象。 

通过new Object() 的写法生成新对象,与字面量的写法 o = {} 是等价的。 

对象属性

对象中包含一系列属性,这些属性是无序的。每个属性都有一个字符串key和对应的value。

var obj={};
obj[1]=1;//Object{1:1}
obj['1']=2;//Object{1:2}
//会把[]内转换为字符串

属性值有value值、get/set方法,writable、enumerable、configurable属性标签。

属性读写

function foo(){
}

foo.prototype.z=3;
var obj=new foo();
typeof obj.toString;//'function',基类方法
'z' in obj;//true
obj.hasOwnProperty('z');//false 本身的属性
obj.z=5
foo.prototype.z;//still 3
delete obj.z;//true 不能继续删除原型链
obj.z;//still 3

get/set方法(存取器)

var man={        
  get age(){
    return new Date().getFullYear()-1991;
  },
  set age(val){
    console.log('age can\'t be set to '+val);  
  }
};

man.age;//24 不能设置的只读属性

利用存取器,还可以实现数据对象与DOM对象的双向绑定。http://javascript.ruanyifeng.com/stdlib/object.html#toc3

属性标签

Object.getOwnPropertyDescriptor({pro : true}, 'pro');
//{value: true, writable: true, enumerable: true, configurable: true}

var person = {};
Object.defineProperty(person, 'name', {
    configurable : false,//能否配置以及delete
    writable : false,//只读
    enumerable : true,//能否被for..in、Object.keys()、JSON.stringify()
    value : "cbw"
});

person.name = 1;
person.name; // still cbw
delete person.name; // false

 另外还有:

  • Object.defineProperties():Object.defineProperty()升级版,定义多个属性。
  • Object.getOwnPropertyNames():返回直接定义在某个对象上面的全部属性的名称(类似于Object.keys()但无视enumerable)。

继承自Object的方法

除了Object对象本身的方法,还有不少方法是部署在Object.prototype对象上的,所有Object的实例对象都继承了这些方法。

Object实例对象的方法,主要有以下六个。

  • valueOf():返回当前对象对应的值。
  • toString():返回当前对象对应的字符串形式。
  • toLocalString():返回当前对象对应的本地字符串形式。
  • hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。
  • isPrototypeOf():判断当前对象是否为另一个对象的原型。
  • propertyIsEnumerable():判断某个属性是否可枚举。

控制对象状态

JavaScript提供了三种方法,精确控制一个对象的读写状态,防止对象被改变。最弱一层的保护是preventExtensions,其次是seal,最强的freeze。

  • Object.preventExtensions方法可以使得一个对象无法再添加新的属性。
  • Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性。
  • Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量。

需要注意的是,使用上面这些方法锁定对象的可写性,但是依然可以通过改变该对象的原型对象,来为它增加属性。一种解决方案是,把原型也冻结住。

原型链相关方法(ES5)

  • Object.create():生成一个新对象,将参数作为对象的原型。
  • Object.getPrototypeOf():获取对象的Prototype对象,obj.__proto__===Object.getProtoypeOf(obj)。

 

  

 

posted on 2015-11-04 20:42  cbwleft  阅读(121)  评论(0)    收藏  举报