Object

2018-03-04大约8分钟

JS里,以小写字母开头的值类型(数值、字符串、true/false),都不算是对象。如果需要创建对象出来,其中的一种方法就是用Object构造函数来创建。

Object就是创建一个对象的装饰器,几乎所有的 JavaScript 对象都是 Object 的实例,一个典型的对象继承了Object.prototype的属性(包括方法)。

创建对象

Objectnew关键字一起使用,可以创建一个对象。

为了判断一个变量或对象的类型,可以用typeof 运算符。

console.log(`typeof 10: ${typeof 10}` );
console.log(` typeof new Object(10): ${typeof new Object(10)}` );

console.log(`typeof "a": ${typeof "a"}` );
console.log(` typeof new Object("a"): ${typeof new Object("a")}` );

console.log(`typeof true: ${typeof true}` );
console.log(` typeof new Object(true): ${typeof new Object(true)}` );

console.log(`typeof {}: ${typeof {}}` );
console.log(` typeof new Object({}): ${typeof new Object({})}` );

从上面代码中可以看出,用new Object(value)创建的都是对象,并且{}new Object(value)创建出的都是对象。

在实际编程中,鼓励使用{}来创建对象,代码直观易懂。

修改对象

我们定义一个对象,并且随时添加或删除其属性。

let user = { name: "张三", password: "abc" };

// 添加一个新属性:age
user.age = 15;
console.log(`age: ${user.age}`);

// 删除属性:password
delete user.password;
console.log(`password: ${user.password}`);

可以看出,删除一个属性,用了delete运算符。

但是要注意,delete运算符只能删除对象的属性,而不能删除已经创建的变量。比如,下面的例子中的用法是不对的:

let user = { name: "张三", password: "abc" };
console.log(delete user);
console.log(delete user.password);

delete删除user变量的时候,返回了false,表示删除失败;而删除user.password的时候,返回的是true

另外也可以得出一个结论,delete失败的时候,程序是不会报错的。

冻结/密封对象

由于JS中用{}创建的对象,是动态的对象,是可以随意增添对象的属性,也可以修改对象的值。这给编程带来了很大的灵活性,但也有时候,不希望对象能够被任意修改。这时候,可以使用Object.freeze()方法来实现。

Object.freeze()方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。Object.isFrozen()方法判断一个对象是否被冻结。

let user = { name: "张三", password: "abc" };
Object.freeze(user);

user.age = 16;      // 默默地不做任何事
console.log(user.age);
console.log(`user.age: ${user.age}`); 

user.name = "李四";     // 默默地不做任何事
console.log(`user.name: ${user.name}`);

console.log(`isFrozen: ${Object.isFrozen(user)}`);

有的时候呢,只是希望能够不要添加或删除属性,但还是希望能够修改对象的属性值,那么这个时候,可以用另外一个方法:Object.seal()

Object.seal() 方法可以让一个对象密封,并返回被密封后的对象。密封对象将会阻止向对象添加新的属性或删除属性。

Object.isSealed() 方法判断一个对象是否被密封。

let user = { name: "张三", password: "abc" };
Object.seal(user);

user.age = 16;      //默默地不做任何事
console.log(user.age);
console.log(`user.age: ${user.age}`); 

user.name = "李四";     // 可以修改
console.log(`user.name: ${user.name}`);
console.log(`isSealed: ${Object.isSealed(user)}`);