JavaScript对象

102 阅读2分钟

对象

定义

  • 无序的数据集合
  • 键值对的集合

写法

  1. let obj = {'name':'yesy,'age':18}
  2. let obj = new Object({'name':'yesy,'age':18})(正规)
  3. console.log({'name':'yesy,'age':18})

注意点

  1. 键名是字符串,可以包含任何字符串,不是标识符
  2. 键名的引号一般可以省略,省略之后就必须写标识符

属性

delete obj.attr

delete obj[attr]

var obj = {
    name:'yesy',
    age:18
}
delete obj.age|delete obj[age]
'age' in obj//false

改(写)

//直接赋值
var obj = {age:18,name:'yesy'}
obj.age = 19
obj.['age'] = 19
//批量赋值
Object.assign(obj,{name:'yesy',age:18})

无法通过自身修改共有属性

//通过自定义原型创建对象
var chinese = {hair:'black',skin:'yellow'}
var person = Object.create(chinese,{
    name:{value:'yesy'}
})//以chinese为原型创建person

这样 person 的 __proto__就是 chinese对象

查(读)

  • Object.keys(obj) 查看自身所有属性
  • Object.values(obj) 查看自身所有属性的值
  • console.dir(obj) 查看自身所有属性+公有属性
  • obj.hasOwnProperty('toString')判断一个属性是自身的还是共有的
  • obj.attr|obj['attr']查看某个属性的值
var obj = {
    name:'yesy',
    age:18
}
Object.keys(obj)//["name", "age"]
Object.values(obj)//["yesy", 18]
Object.entries(obj)
//[Array(2), Array(2)]0: (2) ["name", "yesy"]1: (2) ["age", 18]length: 2__proto__: Array(0)
obj//{name: "yesy", age: 18}
console.dir(obj)//age: 18 name: "yesy" __proto__: Object
obj.hasOwnProperty('toString')//false 不是自身属性
obj.name//yesy
obj['name']//yesy

person.[name]与person.name

?处填写什么使得person所有属性被打印出来

let list = ['name', 'age', 'gender']
let person = {
name:'frank', age:18, gender:'man'}
for(let i = 0; i < list.length; i++){
let name = list[i]
console.log(person__???__)
}

答案:person.[name]

person.[name]是调用name变量;person.name是name字符串

构造函数

可以构造出对象的函数,constructor指向对象本身

new

new做的事情:

  1. 自动创建新对象
  2. 自动为新对象关联原型,yesy.__proto__ === Person.prototype;
  3. 自动将新对象作为 this关键字运行构造函数
  4. 自动执行构造函数中的代码
  5. 自动 return this

var yesy = new Person()

graph BT
A[yesy实例]-->|__proto__|B[Person.prptotype对象原型]
C[Person对象]-->|prototype|B
B-->|constructor|C

ES6新语法: class

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}