ECMAScript5 Object对象和属性

对象和属性:
属性一共分成三类,分别是命名数据属性、命名访问器属性和内部属性,前两类属性可以在代码中直接使用,而后面一种属性是规范使用的内部表示。

命名属性一般有:
Value:表示该属性的值
Writable:表示该属性的值是否为只读的
Enumerable: 表示该属性是否可以被枚举,可以被枚举的属性可以通过 for-in 循环来获取到
Configurable:表示该属性是否可以被配置,为true则表示 该属性可以被删除、可以被转换为访问器属性。

命名访问器属性:该类属性没有Value和Writable特性,属性获取和设置则通过get和set特性(函数)来实现。

内部属性:作用是定义 ECMAScript 中的对象在不同情况下的行为,常用的内部属性有:
Prototype属性:每个对象都有内部属性Prototype,用来引用另外一个对象。
Class属性:用来声明对象的类别,通过 Object.prototype.toString 函数可以获取到Class属性的值,当需要判断一个对象是否为     数组时,可以使用代码 Object.prototype.toString.apply(obj) === '[object Array]'。

Object 对象是 ECMAScript 中非常重要的一个对象。Object 对象本身是一个函数,所以typeof Object值是 function
Object 函数既可以直接调用,也可以作为构造函数来创建新的对象: Object() 的作用相当于 new Object(),所以Object("Hello")和new Object("Hello")调用结果是相同的。

Object属性有如下几种:
Object.prototype:这个属性可以获取 ECMAScript 中内置的 Object 原型对象,并访问其中的属性。
Object.getPrototypeOf:这个函数可以获取 Object 类型对象的内部属性 [[Prototype]] 的值。
Object.getOwnPropertyDescriptor:这个函数用来获取 Object 类型对象自身所拥有的属性的描述信息。描述信息是一个 Object 类型的对象,其中包含了属性的特性值。
例如:
Object.getOwnPropertyDescriptor({val:1}, 'val')的执行结果是{"configurable":true,"enumerable":true,"value":1,"writable":true}。


Object.getOwnPropertyNames:该函数用来获取一个包含 Object 类型对象自身所拥有的属性名称的数组。
例如:
Object.getOwnPropertyNames({a:1, b:2});的执行结果是["a", "b"]。

Object.defineProperty:该函数用来在 Object类型对象中创建一个新的属性。在调用时除了属性的名称之外,还需要提供属性的特性值。如果该名称的属性在对象中已经存在,则更新已有的属性。
例如:
var obj = {};
Object.defineProperty(obj, 'val', {}); // 创建一个新属性,特性为默认值,且新属性是可以被枚举的
obj.val = 1;
Object.defineProperty(obj, 'CONSTANT', {value : 32, writable : false}); // 创建一个只读属性
obj.CONSTANT = 16; // 对属性的修改是无效的,但是不会抛出错误


Object.defineProperties:该函数的作用类似于 Object.defineProperty,只不过该函数支持同时定义多个属性。
例如:
Object.defineProperties(obj, {a : {}, b : {}});定义两个新的属性 a 和 b。

Object.keys:调用该函数可以得到一个包含 Object 类型对象中所有可被枚举的属性的名称的数组。这个数组中包含的属性与使用 for-in 循环所能访问到的属性是相同的。

Object.create:该函数用来创建一个新的对象。新创建对象的内部属性Prototype的值由调用时的参数指定。在调用时还可以传入一个包含要定义的属性的对象。这个参数对象会被传递给 Object.defineProperties 函数来在新创建的对象中定义属性。通过 Object.create 可以很容易地实现基于原型的继承;
例如:
var Parent = {
    getName: function() {
        return this.name;
    }
}
 
var child = Object.create(Parent, {
    name: { value: "Benjamin"},
    url : { value: "http://www.zuojj.com"}
});
console.log(child.getName()); //Benjamin


Extensible的作用是否允许在对象中动态添加新的property。
Object.preventExtensions 和 Object.isExtensible:这两个函数用来设置和获取 Object 类型对象的内部属性 Extensible 的值。调用函数 Object.preventExtensions 之后会把内部属性 Extensible 的值设为 false。一旦设为 false 之后,就无法在代码中重新设置回 true。

Object.seal 和 Object.isSealed:调用 Object.seal 函数会把内部属性 Extensible 的值设为 false,同时把对象所拥有的每个属性的特性 Configurable的值也设为 false。
例如:
 var obj = {val : 1};
 obj.newVal = "Hello";

 Object.seal(obj);
 Object.defineProperty(obj, 'anotherVal', {}); // 抛出 TypeError 错误

Object.freeze 和 Object.isFrozen:Object.freeze 函数除了会执行 Object.seal 函数中所做的处理之外,还会把对象所拥有的命名数据属性的特性 Writable的值设为 false。

Object.preventExtensions、Object.seal 和 Object.freeze 函数可以用来保护对象,防止被第三方有意或无意的修改。

猜你喜欢

转载自kstgjfk403.iteye.com/blog/2299273