Javascript中的对象-Object

2016-03-09

Javascript中Object是所有对象的祖宗,所有对象都继承自它,而它本身也是一个构造函数,可以直接生成或包装对象

Object对象的方法

当Object 被作为工具方法,而不是构造方法时,

  • Object(arg):包装方法,将非对象类型包装成一个对象
  • Object.create(proto[, propertiesObject]):
  • Object.getPrototypeOf(obj):

Object实例对象的方法

必须区分“构造函数的方法”和“实例对象的方法”。

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

对象的属性模型

  • Object.getOwnPropertyDescriptor():获取对象的属性的精确描述模型

Object.defineProperty()
Object.defineProperties()
这两个方法有性能损耗,会拖慢执行速度,不宜大量使用。

可枚举性(enumerable)

如果一个属性的enumerable为false,下面三个操作不会取到该属性。

for..in循环
Object.keys方法
JSON.stringify方法(有时可以利用这一点,为对象添加注释信息。)

因此,enumerable可以用来设置“秘密”属性。
遍历对象属性方法

  • Object.keys()
  • Object.getOwnPropertyNames()
    一般情况下,几乎总是使用Object.keys方法,遍历数组的属性。

存取器

1
2
3
4
5
6
7
8
9
10
11
12
13
var o ={
$n : 5,
get next(){return this.$n++ },
set next(n) {
if (n >= this.$n) this.$n = n;
else throw "新的值必须大于当前值";
}
};

o.next // 5

o.next = 10;
o.next // 10

利用存取器,可以实现数据对象与DOM对象的双向绑定。

对象拷贝

对于简单属性,就直接拷贝,对于那些通过描述对象设置的属性,则使用Object.defineProperty方法拷贝。

1
2
3
4
5
6
7
8
9
10
11
12
13
var extend = function (to, from) {
var descriptor = Object.getOwnPropertyDescriptor(from, property);

if (descriptor && ( !descriptor.writable
|| !descriptor.configurable
|| !descriptor.enumerable
|| descriptor.get
|| descriptor.set)) {
Object.defineProperty(to, property, descriptor);
} else {
to[property] = from[property];
}
}

控制对象状态

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

不可扩展对象(不能加,可改,可删)

Object.preventExtensions方法可以使得一个对象无法再添加新的属性。可以用delete命令删除它的现有属性。
判断: Object.isExtensible(obj);

密封的对象(不能加,删,可改)

Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性。

判断: Object.isSealed(obj);

冻结的对象(不能加,不能改,不能删)

Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量。
判断: Object.isFrozen(obj);

局限性: 需要注意的是,使用上面这些方法锁定对象的可写性,但是依然可以通过改变该对象的原型对象,来为它增加属性。