对象

创建对象

JavaScript 中的对象可以简单理解成“名称-值”对,有两种简单方法可以创建一个空对象:

1.var obj = new Object();

function Person(name, age) {
  this.name = name;
  this.age = age;
}
var person = new Person("nicole", 24);
console.log(person.name);  // 'nicole'

2.var obj = {}; // 对象字面量(object literal)

原型(prototype)

每一个javascript对象(null除外)都会和另外一个对象相关(prototype)。 可以通过obj.prototype获得原型对象的引用。 后续将有一章专门讲对象原型。

访问对象属性

对象的属性可以通过链式(chain)表示方法进行访问:

1.obj.details.color; // orange

2.obj["details"]["size"]; // 12

第二种方法的优点:属性的名称被看作一个字符串,这就意味着它可以在运行时被计算

删除对象属性

delete obj.propertyName

枚举属性

for(var key in obj) 如果只是枚举对象的自定义属性,需要加上checking condition: obj.hasOwnProperty(p)

属性的getter和setter(存储器属性)

上面讲到的都是‘数据属性’(数据属性只有一个简单的值)。

和‘数据属性’不同,存储器属性不具有可写性。如果属性同时具有getter和setter方法,那么它是一个读/写属性;如果只有getter,那就是只读属性;如果只有setter,那就是只写属性。

 var p = {
    x: 1,  
    y: 2,
    get r() {
        return this.x + this.y;
    },
    set r(ratio) {
        this.x = ratio * this.x;
        this.y = ratio * this.y;
    },
    get s() {
        return this.x * this.y;
    }
};

p.r = 4;
p.s = 5;
console.log(p.r);  //12
console.log(p.s);  //32

属性描述符

除了包含名字和值之外,属性还包含一些标识它们可写,可枚举,可配置的特性。在ES3中无法设置这些特性。

从ES5开始,所有的属性都具备了属性描述符。

var myObject={    
    a:2
};
Object.getOwnPropertyDescriptor(myObject,"a");    
//    {
//      value:    2,
//      writable:    true,  //是否可修改
//      enumerable:    true, //是否在for...in循环中出现
//      configurable:    true //修改一个不可配置的属性描述符会出错
//    }

在创建普通属性时属性描述符会使用默认值,我们也可以使用Object.defineProperty(..)来添加 一个新属性或者修改一个已有属性(如果它是configurable)并对特性进行设置。

var myObject = {};
Object.defineProperty( myObject,"a",{
        value: 2,
        writable: false,    
        configurable: true,    
        enumerable: true
}    );    
myObject.a = 3;
myObject.a;    // 2

如果只定义value,那么其他属性特性为false。

var o ={};
Object.defineProperty(o,'x'{value:1});
Object.getOwnPropertyDescriptor(o,'x');

==>Object {value: 1, writable: false, enumerable: false, configurable: false}

使用场景,比如声明一个常量。

Object.seal(..)会创建一个“密封”的对象,这个方法实际上会在一个现有对象上 用Object.preventExtensions(..)并把所有现有属性标记为configurable:false。

Object.freeze(..)会创建一个冻结对象,这个方法实际上会在一个现有对象上调 用Object.seal(..)并把所有“数据访问”属性标记为writable:false,这样就无法修改它们的值。

results matching ""

    No results matching ""