创建call_apply.js文件,代码如下
// 声明一个pet对象
var pet = {
words: '...',
// 声明一个speak方法
speak: function(say){
console.log(say + ' ' + this.words);
console.log(this);
}
}
// 调用pet中的speak方法
pet.speak('Speak');
以上代码执行结果如下:
$ node call_apply.js
Speak ...
{ words: '...', speak: [Function] }
- 使用call改变上下文方式一
创建call_apply.js文件,使用call 改变上下文,代码如下
// 声明一个pet对象
var pet = {
words: '...',
// 声明一个speak方法
speak: function(say){
console.log(say + ' ' + this.words);
console.log(this);
}
}
// 调用pet中的speak方法
// pet.speak('Speak');
// 声明一个dog对象
var dog = {
words: 'Wang'
}
// 将pet.speak的this指向了dog,改变了执行上下文
pet.speak.call(dog,'Speak');
以上代码执行结果如下:
$ node call_apply.js
Speak Wang
{ words: 'Wang' }
- 使用call改变上下文方式二
创建call_apply_extend.js文件,使用call 改变上下文,代码如下
// 声明一个pet函数
function Pet(words){
// 将words赋值给this.words属性
this.words = words;
// 声明一个speak方法
this.speak = function(){
// 调用this中的this.words
console.log(this.words);
console.log('Pet:' , this);
}
}
// 声明一个Dog方法
function Dog(words){
// 将Pet的this指向了Dog
// Dog中并没有speak方法,通过call方法将Pet中speak方法指向了Dog中,使Dog也能够调用speak方法
Pet.call(this,words);
console.log('Dog:' , this);
// Pet.apply(this,arguments);
}
// 创建一个实例对象
var dog = new Dog('Wang');
// 调用speak方法
dog.speak();
以上代码执行结果如下:
$ node call_apply_extend.js
Dog: Dog { words: 'Wang', speak: [Function] }
Wang
Pet: Dog { words: 'Wang', speak: [Function] }