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实例,它结合了来自环境的(函数执行所需的)局部变量。