方法
在一个对象中绑定函数,称为这个对象的方法
var xiaoming = {
name: 'xiaoming',
brith: 1997,
age: function(){
var y = new Date().getFullYear();
return y - this.brith;
}
}
xiaoming.age() // 21
当我们想使用第三方变量替换冗长的xiaoming.age()
的时候,我们来看看效果
// 写法1
fn = xiaoming.age;
fn() // NaN
// 写法2
fn = xiaoming.age();
fn // 21
当我们采用第一种写法的时候实际是将age方法提出来了,那么this
所指向的对象也变成了window
,故表示NaN
那么为了避免被外部调用,并且可以循环使用其age()
我们引入that
'use strict'
var xiaoming = {
brith: 1997,
age: function(){
// 从方法一开始就获取this
that = this;
function getAgeFromBrith() {
var y = new Date.getFullYear();
return y - that;
}
return getAgeFromBrith();
}
}
xiaoming.age(); // 21
var fn = xiaoming.age;
fn(); // Uncaught TypeError: Cannot read property 'birth' of undefined
apply与call
我们知道函数通过this
来指代对象,那如果我们想指代某一对象应该如何操作呢?
这时候就可以使用apply
与cell
了
function getAge() {
return this.age;
}
var xiaoming = {
name: 'kaso',
age: 20
}
getAge.apply(xiaoming, []); //20
getAge.call(xiaoming, []); //20
appay | call 区别
//调用Math.max(3, 4, 5)
Math.max.apply(null, [3, 4, 5]) // 5
Math.max.call(null,3,4,5) // 5
装饰器
装饰器多用于将函数进行改造更名,如改造alert
使其具有弹窗与控制台双重功能
// 保存原来的 alert
var oldAlert = alert;
window.alert = function() {
alert(this);
console.log(this);
return oldAlert.apply(null, arguments);
}
alert("halo")