在一个对象中绑定函数,称为这个对象的方法
定义
原始的对象表示
var Person = {
name: "Eric",
birth: 1990
};
但是,如果我们给Person
绑定一个函数,就可以做更多的事情。比如,写个age()
方法,返回Person
的年龄
var Person = {
name: "Eric",
birth: 1990,
age: function () {
var y = new Date().getFullYear();
return y - this.birth;
}
};
Person.age; // function Person.age()
Person.age(); // 今年调用是27,明年调用就变成27了
Person
对象中获取age
的函数就是对象 Person
的方法
关键词 this
在一个方法内部,this
是一个特殊变量,它始终指向当前对象,也就是Person
这个变量。所以,this.birth
可以拿到Person
的birth
属性。
function getAge() {
var y = new Date().getFullYear();
return y - this.birth; // this 表示该函数的调用者
}
var Person = {
name: "Eric",
birth: 1990,
age: getAge
};
Person.age(); // 27, 正常结果
getAge(); // NaN
当方法内部调用方法的时候,使用this
就有问题了
var Person = {
name: "Eric",
birth: 1990,
age: function () {
function getAgeFromBirth() {
var y = new Date().getFullYear();
return y - this.birth;
}
return getAgeFromBirth();
}
};
// 此时就会报错,因为当前的 `this` 指向 `undefined`
Person.age(); // Uncaught TypeError: Cannot read property 'birth' of undefined
上面的报错是因为在方法内部调用 this
,this
指向的为空
解决方法: 用一个that变量首先捕获this
var Person = {
name: "Eric",
birth: 1990,
age: function () {
var that = this; // 在方法内部一开始就捕获this
function getAgeFromBirth() {
var y = new Date().getFullYear();
return y - that.birth;
}
return getAgeFromBirth();
}
};
// 此时就会报错,因为当前的 `this` 指向 `undefined`
Person.age(); // 27
用 var that = this;
后,将最外层的 对象 保存起来,供内部函数调用
方法 apply
虽然this
在嵌套函数中会指向 undefined
, 但是this
的指向是可以控制的
用函数本身的apply
方法,指定函数的this
指向哪个对象,第一个参数就是需要绑定的this
变量,第二个参数是Array
,表示函数本身的参数。
function getAge() {
var y = new Date().getFullYear();
return y - this.birth; // this 表示该函数的调用者
}
var Person = {
name: "小明",
birth: 1990,
age: getAge
};
Person.age(); // 27, 正常结果
getAge.apply(Person, []); // 27, this指向Person, 参数为空