JS 对象
在 javascript 中,一个对象可以是一个单独的拥有属性和类型的实体。我们拿它和一个杯子做下类比。一个杯子是一个对象(物体),拥有属性。杯子有颜色,图案,重量,由什么材质构成等等。同样,javascript 对象也有属性来定义它的特征。
一、声明一个对象
如何声明一个对象
let obj = { key1: "value1", key2: "value2" };
其中
- obj 是对象的名称,可以是任意标识符
- key 是对象的键名,类型总是 string,一般加上双引号”",如果省略则可以是合法标识符和数字,symbol 也能做为键名
- value 是对应键名的值,可以是任意类型
下面介绍几种特殊的键名(属性名 property)
(1)表达式做属性名
例如
Let obj={[1+2+3]:"10"}
let obj={1e2:"10"}
上述语句等价于
Let obj={[10]:"10"}
let obj={100:"10"}
这是因为对象的属性名始终是 string 类型,所以如果去掉引号,会被强制转成 string 类型,这时候数字或者数学表达式就会默认变成 10 进制,所以保险起见,最好别省略”"
(2)变量做属性名
上述的属性名都是常量,但是要传入一个变量作为属性名应该怎么做呢
let p1 = "name";
let obj = { [p1]: "freshman" };
这样的写法会先求出 p1 的值,即"name”,然后再传入属性名中等价于
let obj = { name: "freshman" };
但是要注意如果
let obj = { p1: "freshman" };
那么实际上,属性名还是 p1,并不会传入 name 作为属性名
二、 属性的增、删、改、查
(1) 查属性
在 js 中,是用原型链来定义一个对象的类的,所以一个对象有基于原型的共有属性(prototype)和自身的私有属性(OwnProperty)
- 查看自身属性名
Object.keys(obj);
- 查看自身属性值
Object.values(obj);
- 查看所有属性结构
Console.dir(obj);
这里会打印出对象的私有属性和原型proto
- 用数组的方式查看键值对
Object.entries(obj);
- 如何判断一个属性是否是私有属性呢
name.hasOwnProperty("key");
可以查询 key 属性是否是 name 对象的私有属性,若为 true 则是,false 则不是。
那么如何查看单独的一个属性呢
- 中括号语法
obj["key"];
等价于
- 点语法
obj.key;
但是和
obj[key];
并不相等,obj[key]
代表的是变量 key 的属性值。
(2) 删属性
delete obj.name;
delete obj["name"];
这里的注意点和上文的相同,[]中省略"“代表的是变量,而不是字符串的属性名
如何查看属性是否还在对象中呢
“xxx” in obj
(3)增加和修改属性
- 中括号
obj.key1 = "a";
- 点语法
obj["key1"] = "a";
- 传入变量
let x = "key1";
obj[x] = "a";
这里要强调的问题同上,obj.x
等价于obj["x"]
而不等价于obj[x]
,所以要深刻理解属性名是 string 类型这个点。
- 写入多个属性
Object.assign(obj, { k1: 1, k2: 2, k3: 3 });
三、 原型链和原型
如果我想要修改一个属性的原型该怎么办呢 如果只是在对象上写入某个与原型同名的属性,那么并不会影响到原型的属性,这是因为原型的读写权限不一致决定的,而且就算改变了对象原型的某个属性,对象再次定义这个属性的属性值,此时重新定义的属性会覆盖原型的属性,可以做一个小实验
但是!尽量别更改对象的原型,如果非要更改可以选择更改window.Object.prototype
接下来讲一下原型链的使用
let common = { kind: "human" };
let obj = Object.create(common);
用 Object.create()
能以某个对象为原型生成一个对象,那么这个新对象 obj 的原型就是 common,他的_proto_
隐藏属性就是 common,同时 common 也是一个对象,也有自己的隐藏属性,他的_proto_
指向对象的根原型。