教程

之前我们学过字符串和数字类型,这节课我们学一个新的数据类型,叫做对象,这个概念是最重要的编程概念。

对象是大多数编程语言都有的一个概念,比如python和java里面都有这个概念,当你学会了这个概念,结合学习Python,那么问题不大

那什么是对象呢?

Object refers to a data structure containing data and instructions for working with the data.

大意是:对象是指包含数据和用于处理数据的指令的数据结构

这个定义对我们的理解没有太大的帮助,所以我们还是举个例子。

一辆汽车,我们可以叫它对象。一个人我们也可以叫它对象。一台电脑是一个对象,一个手机也是一个对象。万物皆是对象!

对象就好像我们中文里面的一个单词,叫:东西

一切都是东西,一切都是对象

我们该如何创建一个对象呢?对象又有什么用呢?

我们接下来打开开发者工具,新建一个项目。

打开调试器,找到console面板,因为这里可以直接调试并看到我们的代码执行结果,所以这里就像是一个操场一样,可以随时演练我们的代码

创建对象的方法有两种,第一种是

let car1 = new Object()

你可以看到这个式子左边实际上是定义了一个变量,右边new Object() 的意思是创建一个对象,中间的等号是赋值的意思。

这句话的意思就是,创建一个对象,然后赋值给car1变量。这样我们就有了一个对象了,这个对象的名字叫car1

还有一种方法创建对象的方法是

let car2 = {}

左边还是差不多,定义了一个变量car2,右边变成了一对大括号。这个创建对象的方法写的字符少,所以一般都用这种方法创建。

现在我们创建了两个对象,也就是两辆车,一辆车叫car1,另一辆叫car2。

前面的定义提到对象是包含数据的,但我们看这些符号也没有看出这两辆车长什么样。

比如我们买车一般都会关注,价格,品牌,性能,外观等。

比如这是一辆价格10万的大众牌红色轿车,百公里加速6秒。

这句话包含了多少信息?

价格:10万
品牌:大众
性能:百公里加速6秒
外观:红色

我们在代码里面应该如何创建一辆这种车呢?我们可以这样

let car3 = {
	price: 100000,
	brand: '大众',
	performance: '百公里加速6秒',
	color: 'red'
}

这样我们就创建了一个有模有样的汽车对象。

注意一下这里的格式,主要是注意右边的大括号包起来的东西,你仔细看看,是不是有一定的规律。price,brand,performance,color这些东西是对象的属性,也就是汽车的属性。冒号后面,逗号之前的东西就是这个属性的值。'red’后面没有逗号,因为它是最后一行,可以省略不写,当然你也可以加上,也不不会有错的。

不是非要这样换行写才可以,可以不用换行写。比如

let car3 = {price: 100000,brand: '大众',performance: '百公里加速6秒',color: '红色'}

换行写只是为了直观一点,属性与属性之间的那些空格不是必须的,所以多一个空格少一个空格不会报错。

那现在我们有了对象,我们怎么用它呢?

比如我想要知道判断这个汽车的价格是否大于50000,那么我们怎么才能访问到它的属性呢?怎么才能把price属性拿出来和50000进行比较呢?

我们可以这样拿到对象的属性

car3.price

这句话的意思是,访问car3对象的price属性,回车执行,然后会看到屏幕上输出100000

这就是拿到了对象的属性了

还有一种访问对象属性的方法是这样

car3['price']

回车执行,然后会看到屏幕上输出100000,这样也是可以的,写法不同,但是效果一样。

虽然我们拿到了对象的属性,但是我们啥也没有做。

因为我们想要知道这个汽车的价格是否大于5万,那我们可以这样做

car3.price > 50000

这个看起来就很熟悉了,这就是一个比较语句,最终返回的结果是true或者false。按一下回车,我们发现返回的是true,说明这辆汽车的价格是大于5万的。

我们能拿到它的属性,那我们能不能改它的属性呢?

比如把颜色从红色换成黑色

我们可以这样

car3.color = '黑色'

这和变量赋值是一样的,等号左边的值只不过是对象的属性而已。对象的属性也是变量,所以可以赋值。

那我们能不能新增一些属性呢?比如给这辆车加个名字

car3.name = '桑塔纳'

回车执行,然后会看到屏幕上输出桑塔纳,这就说明已经增加了新的属性。

然后我们再访问一下,看看能不能访问到

car3.name

当然我们还可以直接访问对象

比如

car3

然后屏幕上就会输出这个对象的所有属性和值,我们可以点开看看

接下来话不多说,我们做一个小程序来体会一下这个对象。

我们要做的是一个购车小程序,这个小程序,用户输入一个价格,然后我们告诉它,他能买得起车,并展示那款车的所有属性。如果用户输入的价格不能购买车,那我们就提示它,存点钱再来。

先看一下这个小程序长什么样。

当你输入购车金额大于等于100000时,点击按钮提示:恭喜你!你的钱能买得起这辆车!价格是:100000,品牌是:大众

当你输入的是小于100000的数时,会提示:钱不够,存够钱再来

现在我们开始做这个小程序

打开index.wxml文件,然后复制如下代码

<!--index.wxml-->
<view class="container">
  <view class="userinfo">
    <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
  <view class="usermotto">
    <text class="user-motto">我能买车吗?</text>
    <input bindinput="bindMoneyInput" placeholder="请输入你的购车金额" type="number"></input>
    <button bindtap="test">测算一下</button>
  </view>
</view>

打开index.js文件,删除第7行

motto: 'Hello World',

然后在第6行后增加一行

money: 0,

这个money是用来存储用户输入的金额

然后再第53行后面增加如下代码

bindMoneyInput: function (e) {
  this.setData({
    money: Number(e.detail.value)
  })
},
test: function () {

}

然后我们的任务就是完善用户点击按钮后的代码

首先我们需要有一辆车,这个车是一个对象。

所以定义一个对象

let car = {
  price: 100000,
  brand: '大众',
  performance: '百公里加速6秒',
  color: 'red'
}

然后我们要判断用户输入的价格是否比这车的价格高

if (this.data.money >= car.price) {

}

如果输入的金额大于汽车的金额,那么提示的内容是什么呢?

所以,我们要定义个变量来存储这个提示内容

let tip = '恭喜你!你的钱能买得起这辆车!价格是:' + car.price + ',品牌是:' + car.brand

然后展示它

wx.showModal({
  title: '提示',
  content: tip,
  showCancel: false
})

当用户输入的金额小于这辆车的价格又该怎么办呢?

我们提示:钱不够,存够钱再来

wx.showModal({
  title: '提示',
  content: '钱不够,存够钱再来',
  showCancel: false
})

保存一下,输入看看结果

作业

当用户输入的价格大于等于汽车价格的两倍时,我们修改一下汽车属性,比如,把红色换成土豪金,然后把性能提高,然后你还可以增加一个属性,比如升级豪华座椅,最后把价格改成略低于用户输入的价格,然后展示你想要展示的属性,做出来截图发到群里

附件

<!--index.wxml-->
<view class="container">
  <view class="userinfo">
    <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
    <block wx:else>
      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
    </block>
  </view>
  <view class="usermotto">
    <text class="user-motto">我能买车吗?</text>
    <input bindinput="bindMoneyInput" placeholder="请输入你的购车金额" type="number"></input>
    <button bindtap="test">测算一下</button>
  </view>
</view>
//index.js
//获取应用实例
const app = getApp()

Page({
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  //事件处理函数
  bindViewTap: function () {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  onLoad: function () {
    if (app.globalData.userInfo) {
      this.setData({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    } else if (this.data.canIUse) {
      // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
      // 所以此处加入 callback 以防止这种情况
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    } else {
      // 在没有 open-type=getUserInfo 版本的兼容处理
      wx.getUserInfo({
        success: res => {
          app.globalData.userInfo = res.userInfo
          this.setData({
            userInfo: res.userInfo,
            hasUserInfo: true
          })
        }
      })
    }
  },
  getUserInfo: function (e) {
    console.log(e)
    app.globalData.userInfo = e.detail.userInfo
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  },
  bindMoneyInput: function (e) {
    this.setData({
      money: Number(e.detail.value)
    })
  },
  test: function () {
    let car = {
      price: 100000,
      brand: '大众',
      performance: '百公里加速6秒',
      color: 'red'
    }
    if (this.data.money >= car.price) {
      let tip = '恭喜你!你的钱能买得起这辆车!价格是:' + car.price + ',品牌是:' + car.brand
      wx.showModal({
        title: '提示',
        content: tip,
        showCancel: false
      })
    } else {
      wx.showModal({
        title: '提示',
        content: '钱不够,存够钱再来',
        showCancel: false
      })
    }
  }
})

作业参考答案

//index.js
//获取应用实例
const app = getApp()

Page({
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  //事件处理函数
  bindViewTap: function () {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  onLoad: function () {
    if (app.globalData.userInfo) {
      this.setData({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    } else if (this.data.canIUse) {
      // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
      // 所以此处加入 callback 以防止这种情况
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    } else {
      // 在没有 open-type=getUserInfo 版本的兼容处理
      wx.getUserInfo({
        success: res => {
          app.globalData.userInfo = res.userInfo
          this.setData({
            userInfo: res.userInfo,
            hasUserInfo: true
          })
        }
      })
    }
  },
  getUserInfo: function (e) {
    console.log(e)
    app.globalData.userInfo = e.detail.userInfo
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  },
  bindMoneyInput: function (e) {
    this.setData({
      money: Number(e.detail.value)
    })
  },
  test: function () {
    let car = {
      price: 100000,
      brand: '大众',
      performance: '百公里加速6秒',
      color: 'red'
    }
    if (this.data.money >= car.price) {

      let tip = '恭喜你!你的钱能买得起这辆车!价格是:' + car.price + ',品牌是:' + car.brand
      if (this.data.money >= 2 * car.price) {
        car.price = this.data.money - 1000
        car.color = '土豪金'
        car.update = '升级豪华座椅'
        tip = '恭喜你!你的钱能买得起这辆车!价格是:' + car.price + ',品牌是:' + car.brand + ',颜色是:' + car.brand + ',颜色是:' + car.update
      }
      wx.showModal({
        title: '提示',
        content: tip,
        showCancel: false
      })
    } else {
      wx.showModal({
        title: '提示',
        content: '钱不够,存够钱再来',
        showCancel: false
      })
    }
  }
})