this上下文,以及通过call 、apply 实现继承
上下文:this关键字通常指向当前函数的拥有者,把拥有者叫做执行上下文。
this代表函数运行时自动生成的内部对象,只能在函数内部使用。
构造函数中的this 指 构造函数的实例对象。javascript存在定义时上下文和运行时上下文。
函数的 call 和 apply 方法 可以改变上下文执行对象。可以在自定义上下文中执行函数,call 函数需要参数列表,apply 需要一个数组参数。
调用对象的一个方法,以另一个对象替换当前对象,更改对象this指向的内容。以某个方法当做指定的某个对象的方法被执行。
var pet = { words:'…………', speak:function(say){ console.log(say + ' ' + this.words) } } pet.speak('Speak'); var dog = { words:"Wang", } pet.speak.call(dog,'Speak') // 输出: Speak Wang
pet.speak.call(dog,'Speak')
调用的方法是: pet.speak ,理论上说 this 指向pet对象, 但是通过call 改变了执行上下文,把 this指针 指向了 dog 。使 dog对象 有了pet的speak方法 。第二个 ‘Speak’ 是前面的方法 pet.speak 的参数。
通过call或者apply 赋给第一个对象参数 dog 一种能力,即该对象可以调用 前面的方法 的能力。
通过call或者apply 方式,所指定的对象 dog ,这个对象是调用某个方法时,用这个对象作为该方法的上下文。
上面的方法是函数使用的时候才改变 this 对象,以下的程序是在函数定义的时候改变this上下文。
利用call 或者apply 改变 this 上下文的特性 可以实现继承。
function Pet(name,words){ this.name = name;
this.words = words; this.speak = function(){ console.log(this.name + " say: " + this.words); } }
var pet = new Pet('Cat','MIAO');
pet.speak(); //输出: Cat say: MIAO
function Dog(words){ Pet.call(this, words); //把Pet 里面的this 指向当前的 this对象,即 Dog 对象,使 Dog 拥有Pet 的方法。 //Pet.apply(this,arguments) } var dog = new Dog('Wang'); // call 实现了继承。具有 Pet 的方法。 dog.speak() // 输出: Wang say: undefined