系列
JavaScript教程
Object
JS里,以小写字母开头的值类型(数值、字符串、true/false),都不算是对象。如果需要创建对象出来,其中的一种方法就是用Object构造函数来创建。
Object就是创建一个对象的装饰器,几乎所有的 JavaScript 对象都是 Object
的实例,一个典型的对象继承了Object.prototype
的属性(包括方法)。
创建对象
Object
和new
关键字一起使用,可以创建一个对象。
为了判断一个变量或对象的类型,可以用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)}`);