/*定义一个Person类*/
function Person(name,age)
{
this.name=name;
this.age=age;
}
/*定义一个学生类*/
function Student(name,age,grade)
{
/*第一种方法:使用apply*/
/*Person.apply(this,arguments);*//*this指代student对象,只接受两个参数,arguments为
隐式数组对象,用来接受传入的参数*/
Person.call(this,name,age);
/*我理解的这行代码的意思就是让student对象继承Person对象的属性*/
this.grade=grade;
}
/*实例化Student对象*/
var student=new Student("Huaicui Zheng",22,"研究生二年级");
alert("姓名:"+student.name+'\n'+"年龄:"+student.age+"\n"+"年级:"+student.grade);
Bind方法:
var Lilei={
name:'Lilei',
speakEnglish:function (word1,word2,word3) {
/* console.log(this);*/
console.log(this);
console.log('HanMeimei'+" "+word1+" "+word2+" "+word3);/*输出:HanMeimei I Love You*/
}
}
var HanMeimei={
name:"HanMeimei"
}
Lilei.speakEnglish('I','Love','You');
var fn=Lilei.speakEnglish.bind(HanMeimei);/*将作用域改为“HanMeimei”*/
fn("Love","You","!");/*输出:HanMeimei Love You !*/
**总结:**三种方法中的call()和apply()方法很相似,只是传入的参数不同,一个维参数列表,一个为数组,bind()方法与他们不一样,虽然都是改变this的指向,但是结果不一样。BInd()方法返回的是一个新的方法,它是一个完全独立的函数,做个比喻,就是call()和apply()借用的函数都是暂时的,而且是马上执行,bind()方法就是复制的一份,它是永久的,而且可以在需要的时候调用,下面案列中的fn的this指向HanMeimei,而且是永久的指向HanMeimei。
下面我们来看一下牛客网上的测试题: 将函数 fn 的执行上下文改为 obj 对象。
输入:
function () {return this.greeting + ', ' + this.name + '!!!';}, {greeting: 'Hello', name: 'Rebecca'}
输出:
Hello, Rebecca!!!
思路:call、apply方法可以用来代替另一个对象调用一个方法,call方法可以将一个函数的对象上下文从初始的上下文改变为thisObject指定的新对象,如果没有提供thisObj参数,那么Global对象被用于thisObj。
下面是一个事例代码:
function fn()
{
return this.greeting+this.name;
}
var s={
greeting:"Hello,",
name:"Huaicui Zheng"
};
console.log('将函数的上下文改为obj指定的新对象',fn.apply(s));/*Hello,Huaicui Zheng*/