手记

更改上下文方法(更改this指向的内容,可方便地实现继承) call()、apply()

创建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] }
0人推荐
随时随地看视频
慕课网APP