文章目录
前言
一、对象的注意点
- 对象的每个属性有三个属性特性:
writable可写
,enumerable可枚举
,configurable可配置
二、创建对象
1.创建对象的三种方法
(1)使用对象字面量
const obj = {key:value}
(2)使用new关键字
const obj = new Object();
//使用new关键字创建的对象原型是构造函数的原型
(3)使用Object.create()
const obj = Object.create();
//可传入两个参数。第一个参数是新对象的原型,第二个参数描述新对象的属性。
2.原型简介
- 使用对象字面值创建的对象有相同的原型对象,即
Object.prototype
- new关键字创建的对象以构造函数的
prototype
属性作为对象的原型
`new Date()`创建的对象以`Date.prototype`为原型,`new Array()`以`Array.prototype()`为原型
- 几乎所有对象都有原型,但是只有函数对象有
prototype
属性 Object.prototype
没有原型对象
三、查询和设置属性
1.操作符
. 和[]
操作符,[]
操作符里面写一个字符串,字符串需要是对象的属性,写一个变量,则变量的值需要是对象的属性
2.继承
- 查询一个对象的属性时,会先在对象本身查找,如果没有,则查找原型,原型没有,查找原型的原型,直到找到这个值或者原型为null
- 查询对象的属性会用到原型链,而设置对象的属性不会改变原型的属性
JavaScript
基于原型继承而不是基于类继承
3.属性访问错误
- 查询不存在的属性返回
undefined
,查询不存在的对象的属性则报错,可以通过?.
来解决报错的问题
四、删除属性
delete
操作符只删除自有属性,不删除原型属性,操作成功或则没有影响(比如删除不存在的属性)返回true- 通过变量声明或函数声明的的全局属性不能被删除
var o = 1
console.log(delete window.o);//false,声明的全局属性不可被删除
window.z = '1'
console.log(delete window.z);//true,直接通过对象创建的属性可删除
五、测试属性
1.in
解释:测试对象包括原型中是否有某个属性
2.hasOwnProperty()
解释:测试对象,不包括原型。是否有某个属性
六、扩展对象
解释:把一个对象的属性复制到另一个对象上
let target = { x: 1 }, source = { x: 2, z: 3 }
for (let key in source) {
target[key] = source[key];
}
console.log(target);//{x: 2, z: 3}
- 这种写法让一个方法代替了,
Object.assign(target,source,source2)
,source的属性会复制到target,如果有相同的属性名,则属性值会被覆盖,同样,source2会覆盖source
七、对象的序列化
解释:把对象的状态转换成字符串的过程叫做序列化
- 通过
JSON.stringfy()和JSON.parse()
进行序列化和反序列化,JSON.stringfy()
只序列化可枚举属性,如果无法序列化,则删除该属性继续序列化 null,+/-Infinity
会被序列化为null
- 日期对象会别序列化为ISO格式的日期字符串,即使反序列化回来也只会保持其字符串格式,不会恢复成日期对象
let time = new Date();
let str = JSON.stringify(time);
console.log(typeof str);//string
let t = JSON.parse(str);
console.log(typeof t);//string,不会恢复
-----------------------------------------------
let obj = { x: 1, y: 2 };
let o = JSON.stringify(obj);
let b = JSON.parse(o);
console.log(typeof o);//string
console.log(typeof b);//object
- 函数和
RegExp,Error,undefined
不能被序列化或者恢复
八、对象方法
- 所有的
JavaScript
对象都从原型继承属性,而这些属性主要是方法 - 对象方法太多了,没必要写
九、对象字面量扩展语法
1.简写属性与简写方法
let x = 1;
let y = 2;
const obj = {
x,
y,
funName(){},
}
//简写属性:可以直接把外部的属性拿来用,不用key,value
//简写方法:可以直接在对象内部定义方法,不用key,value
2.计算的属性名
- 当对象的属性名
key
不确定的时候,可以用这种方式
let name = 'name';
const obj = {
[name]:1
}
//[]中甚至可以是表达式,函数调用。但是只要求值之后符合属性名的规范就可以
3.扩展操作符
解释:这个操作符在扩展的属性多的时候非常消耗性能,尽量少用
- ES2018之后,可以在对象字面中使用扩展操作符把对象的属性复制到对象中
let obj = { x: 'x', y: 'y' };
let o = { z: 'z', w: 'w' }
let c = { ...obj, ...o };//{x: 'x', y: 'y', z: 'z', w: 'w'}
//只在对象字面量中有效
- 如果扩展的对象和被扩展的对象有相同的属性名,则属性值由靠后的对象决定
let u = { x: 2 }
let a = { x: 1, ...u }//u在后面,覆盖了a对象的x属性
console.log(a);//2
- 扩展操作符值扩展对象的自有属性,不扩展任何继承属性。