对象可以通过两种形式定义:声明(文字)形式和构造形式。
var myObj = { 文字形式。
key: value
// ...
};
var myObj = new Object(); 构造形式。
myObj.key = value;
构造形式和文字形式生成的对象是一样的。唯一的区别是,在文字声明中你可以添加多个键 / 值对,但是在构造形式中你必须逐个添加属性。
内容
var myObject = {
a: 2
};
myObject.a; // 2 属性访问
myObject["a"]; // 2 键访问
这两种语法的主要区别在于 . 操作符要求属性名满足标识符的命名规范,而 [".."] 语法可以接受任意 UTF-8/Unicode 字符串作为属性名。举例来说,如果要引用名称为 "SuperFun!"的属性,那就必须使用 ["Super-Fun!"] 语法访问,因为 Super-Fun! 并不是一个有效的标识符属性名。
对象中属性永远是字符串 字面量 。NUMBER OBJECT都不例外。会给转为STRING。数组是数字。区分对象和数组。
可计算属性名
健访问派上用场了!
ES6 增加了可计算属性名,可以在文字形式中使用 [] 包裹一个表达式来当作属性名:
例如:
var prefix = "foo";
var myObject = {
[prefix + "bar"]:"hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world
属性与方法
属性是个函数,开发者喜欢叫为方法。
数组
复制对象
属性描述符
var myObject = {
a:2
};
Object.getOwnPropertyDescriptor( myObject, "a" );
// {
// value: 2,
// writable: true,
// enumerable: true,
// configurable: true
// }
writable(可写)、enumerable(可枚举)和 configurable(可配置)。
1. Writable
writable 决定是否可以修改属性的值。
writable: false, // 不可写! 对对象的属性修改就无效。
2. Configurable
只要属性是可配置的,就可以使用 defineProperty(..) 方法来修改属性描述符:
configurable:false
把 writable 的状态由 true 改为 false,但是无法由 false 改为 true。
除了无法修改,configurable:false 还会禁止删除这个属性:
3. Enumerable
从名字就可以看出,这个描述符控制的是属性是否会出现在对象的属性枚举中,比如说
for..in 循环。如果把 enumerable 设置成 false,这个属性就不会出现在枚举中,虽然仍
然可以正常访问它。相对地,设置成 true 就会让它出现在枚举中。
用户定义的所有的普通属性默认都是 enumerable,这通常就是你想要的。但是如果你不希
望某些特殊属性出现在枚举中,那就把它设置成 enumerable:false。
对象常量
结合 writable:false 和 configurable:false 就可以创建一个真正的常量属性(不可修改、重定义或者删除):
禁止扩展
Object.preventExtensions(..)
密封
Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用
Object.preventExtensions(..) 并把所有现有属性标记为 configurable:false。
所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以
修改属性的值)。
冻结
Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal(..) 并把所有“数据访问”属性标记为 writable:false, 这样就无法修改它们的值。
网友评论