JavaScript对象的基本原理

对象从何而来

var shinyAndNew = new Object()

对象的属性

var ride = new Object()
ride.make = 'Yamaha'
ride.model = 'V-Star Silverado 1100'
ride.year = 2005
ride.purchased = new Date(2005, 3, 12)

不需要在赋值前声明对象的属性,这些属性不过是通过赋值而产生的。

Object的实例,简称对象,就是一属性集。每个属性由名称和值构成。属性的名称是字符串,属性值可以是任意的javaScript对象,如Number, String, Date, Array, Object, 也可以是函数。

属性不局限于类似于String或Number的类型。一个对象属性可以是另一个Object实例,这个实例又包含其自己的属性集,而属性集中也可以包含拥有属性的对象,以此类推。只要对我们塑造的数据模型有意义,就可以嵌套至任何层次。

var owner = new Object()
owner.name = 'Spike Spiegel'
owner.occupation = 'bounty hunter'
ride.owner = owner

点操作符是属性的简写形式,属性名可以是任何字符串。以下是等价的3个引用:

ride.make
ride['make']
ride['mak' + 'e']

当名称并非有效标识符的时候只能使用通用的引用操作符。

对象字面值

以上代码冗长易错,幸运的是,我们有紧凑的表示法:

var ride = {
    make: 'Yamaha',
    model: 'V-Star Silverado 1100',
    year: 2005,
    purchased: new Date(2005, 3, 12),
    owner: {
        name: 'Spike Spiegel',
        occupation: 'bounty hunter'
    }
}

这种表示法被称为JSON。

作为窗体属性的对象

顶层变量是window对象的属性。如果变量在所有函数作用域外声明,下面语句是等价的:

var foo = bar
window.foo = bar 
foo = bar 

作为一等公民的函数

名称中包含了什么

下面的代码是等价的:

function dosomething() { } 
dosomething = function () { } 

第二行等号右边的部分被称为函数字面值。

作为回调的函数

this到底是什么

this称为函数上下文,其所代表的对象是由调用函数的方式决定的。这意味着,同样的函数可以有不同的上下文,取决于调用函数的方式。

var ride = {
    make: 'Yamaha',
    model: 'V-Star Silverado 1100',
    year: 2005,
    purchased: new Date(2005, 3, 12),
    owner: {
        name: 'Spike Spiegel',
        occupation: 'bounty hunter'
    },
    //演示this
    whatAmI: function () {
        return this.year + ' ' + this.make + ' ' + this.model
    }
}
  • 顶层函数是window的属性,因此当将其作为顶层函数来调用时,其函数上下文就是window对象。
  • 当把函数作为对象的属性来调用时,该对象就成为函数调用的函数上下文。
  • 函数对象的call()属性的第一个参数是函数上下文。
  • 函数对象的apply()属性的第一个参数是函数上下文。

当对象o充当了函数f的调用函数上下文时,函数f就充当了对象o的方法。

闭包

闭包就是function实例,它结合了来自环境的(函数执行所需的)局部变量。