# 03 对象和属性

(点击->高清B站视频) (opens new window)


1. 用对象(object)属性(property)代替变量把数据整合在一个对象中

var user = {
    name: '吉吉喵', // 名字
    money: 10, // 金钱
    hp: 100, // 生命值
    atk: 20, // 攻击力
}

console.log(user.name + '有' + user.money + '金币 ' + user.hp + '生命 ' + user.atk + '攻击力') // 用user.属性名 "点"语法来获取对象属性值


对象属性跟变量相比,在表达多个物体数据的情况下,用对象来表示物体比用零散的变量更方便

var name1 = '吉吉喵' // 名字
var money1 = 10 // 金钱
var hp1 = 100 // 生命值
var atk1 = 20 // 攻击力

var name2 = '雷电猴' // 名字
var money2 = 5 // 金钱
var hp2 = 80 // 生命值
var atk2 = 30 // 攻击力

console.log(name1 + '有' + money1 + '金币 ' + hp1 + '生命 ' + atk1 + '攻击力')

//如果要显示雷电猴的数据, 需要逐个变量改成:
//console.log(name2 + '有' + money2 + '金币 ' + hp2 + '生命 ' + atk2 + '攻击力')

/////////////// 而下面的代码显示雷电猴数据则不用逐个修改变量名, 只需要修改变量user指向的对象
var user1 = {
    name: '吉吉喵', // 名字
    money: 10, // 金钱
    hp: 100, // 生命值
    atk: 20, // 攻击力
}

var user2 = {
    name: '雷电猴', // 名字
    money: 5, // 金钱
    hp: 80, // 生命值
    atk: 30, // 攻击力
}

var user = user1 //先演示user1输出, 然后改成user = user2再演示输出
console.log(user.name + '有' + user.money + '金币 ' + user.hp + '生命 ' + user.atk + '攻击力')

2. 对象属性的赋值和读取

把相关的变量存放在一个对象里,这些变量成为了对象的属性,属性跟变量一样可以被赋值,未赋值的变量可以被读但会返回undefined

var user = {// 有初始属性
    name: '吉吉喵', // 属性name, 初始值'吉吉喵'
    money: 10, // 属性money, 初始值10
}

console.log(user.atk) // 返回unefined, 因为atk未被定义
console.log(atk) //变量在这一点则很不一样, 未被定义被引用会报错而不是返回undefined
// 下面赋值写法跟上面的结果一样
var user = {} // 无初始属性
user.name = '吉吉喵' // 后来赋值补上的属性name
user.money = 10 // 后来赋值补上的属性money

// 还可以用方括号包围字符串的语法来写, 这种写法更加灵活, 因为字符串可以用变量或某些运算结果来获得
var user = {} // 无初始属性
user['name'] = '吉吉喵' // 后来赋值补上的属性name
user['money'] = 10 // 后来赋值补上的属性money
console.log(user['name'] + '有' + user['money'] + '金币 ')

// 跟变量一样, 属性也可以进行加减乘除之类的运算
user.money += 10
user.money -= 5 
user.money *= 2
user.money /= 4

// 计算出来的属性名'name'
var prop = 'na' + 'me'
user[prop] = '雷电猴'
console.log(user.name)

//重点知识! 对象属性赋值与读取在box3中的经典用例是自定义一些API没有的玩家属性
world.onPlayerJoin(({ entity }) => {
    entity.money = 100 // 给玩家实体添加money这个新属性, api里是没有money这个属性的
    world.say(`${entity.player.name}${entity.money}块钱`) //世界播放玩家有多少钱
})

3. 嵌套对象

// 对象里边存放其他对象, 下面的简单例子是模仿我们api里的玩家实体结构
var entity = {
    player: {
        name: '吉吉喵', // 名字
    },
    position: {
        x: 64,
        y: 128,
        z: 32,
    },
    money: 10,
    hp: 100,
    atk: 20,
}

// 用pos暂存entity.position, 这样下面引用xyz就不用每个都写成entity.position.x entity.position.y entity.position.z 这么冗长
var pos = entity.position

console.log(`${entity.player.name}的位置是${pos.x} ${pos.y} ${pos.z}`)