一、object基本知识
- 唯一一种复杂类型
- 定义
- 无序的数据集合
- 键值对的集合
写法
let obj = {'name': 'frank', 'age': 18 }
//常用写法
let obj = new Object({'name': 'frank'})
//正规写法
console.log({'name'; 'frank', 'age': 18})
//
细节
- 键名必须是字符串,不是标识符,可以包含任意字符
- 引号是可以省略的,省略之后就只能写标识符(除了数字)
- 就算引号省略了,键名也还是字符串
- 加引号没毛病
- 属性名:属性值 property: value
- Object.keys(obj) 可以得到 obj 的所有 key
- 用变量值作为 key
- 不加[]会变成字符串 ```javascript let a = ‘xxx’; let obj = {
[a]: 111;
}
<br />
```javascript
obj = {'xxx': 111}
symbol 也可以做属性名 (超纲知识:基本不用)
let a = Symbol();
let obj = { [a]: "Hello" };
奇怪的属性名
let obj = {
1e2: true,
1e-2: true,
0xff: true,
};
obj = {100: true, 0.01: true, 255: true}
obj 隐藏属性
- 每个对象都有
- proto
-
二、原型
每个对象都有原型
- 原型里存着对象的公有属性
- 比如 obj 的原型就是一个对象
- obj.proto存着这个对象的地址
- 这个对象里有 toString/constructor/valueOf 等属性
- 对象的原型也是对象
- delete obj.name / delete obj[‘name’]
- 属性名: 属性值 全删除
- obj.name = undefined
- 只删属性值,属性名还在(赋值行为)
- 查看 obj 里是否有某属性:’xxx’ in obj (属性名记得加引号)
- true 有’xxx’属性
- false 没有’xxx’属性
含有属性名,但值为 undefined ‘xxx’ in obj && obj.xxx === undefined
查
查看 obj 自身所有属性
- Object.keys(obj)
- Object.value(obj)
- Object.entries(obj)
key 和 value 都返回
- 查看公有属性
- console.dir(obj)
- obj.proto (不推荐)
- 判断一个是否有一个属性
- ‘name’ in obj // true/false
对象本身和原型上有的属性都返回 true - obj.hasOwnProperty(‘toString’)
只有对象本身有的属性才返回 true
- ‘name’ in obj // true/false
- 查看一个属性
- obj[‘key’] 优先使用这种
- obj.key
- obj[key]
[]里的 key 不是’key’,而是一个变量,先求变量值
-
修改或增加属性
直接赋值
- let obj = {name: ‘derek’}
- obj.name = ‘derek’
- obj[‘name’] = ‘derek’
- obj[‘na’ + ‘me’] = ‘derek’
- let key = ‘name’; obj[key] = ‘derek’
- 批量赋值
- Object.assign(obj, {age: 18, gender: ‘male’})
修改或增加共有属性
- 无法通过自身修改或增加共有属性 obj.toString = ‘xxx’; 只能修改自身属性
我偏要修改或增加原型上的属性
obj.__proto__.toString = "xxx";
//或
window.Object.prototype.toString = "yyy";
一般来说,不要修改原型,会引起很多问题
原型链 给对象加自定义的原型以 common 为原型创建对象 person:
let common = {
国籍: "中国",
hairColor: "black",
};
let person = Object.create(common, { age: { value: 18 } });
person.name = "derek";
- 修改对象原型推荐这种方法
- 要改一开始就改,别后来再改
- 所有写proto的方法都不推荐