var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: {
fullname: 'Aurelio De Rosa',
getFullname: function() {
return this.fullname;
}
}
};
var test = obj.prop.getFullname;
console.log(test());
让控制台出现Aurelio De Rosa,,apply和call,var that=this这3中方法可以吗?用这3种方式具体该怎么写?除了apply和call,var that=this,还有其他的方式吗?求解。谢谢大家
PHPz2017-04-10 15:18:35
1)
console.log(obj.prop.getFullname());//Aurelio De Rosa 以方法调用方式
2)
var test=obj.prop.getFullname();
console.log(test.apply(obj.prop));//Aurelio De Rosa apply方式调用
3)
var test=obj.prop.getFullname();
console.log(test.call(obj.prop));//Aurelio De Rosa call方式调用
4)
var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: (function(){
var fullname='Aurelio De Rosa';
return {
getFullname:function(){
return fullname;
}
}
})()
};
//Aurelio De Rosa 利用闭包使变量私有化
迷茫2017-04-10 15:18:35
你这里面相当于
var test = function() {
return this.fullname;
}
所以this指向window了。
可以这么写:
1.直接用 obj.prop调用
console.log(obj.prop.getFullname());
2.调用 test 上下文指向obj.prop
console.log(test.call(obj.prop));
console.log(test.apply(obj.prop));
迷茫2017-04-10 15:18:35
楼上已经说了基于调用test时的改变,我说基于定义test的改变
1、可以通过将test改变为一个获取getFullname的值逻辑
var test = function(){return obj.prop.getFullname()};
2、使用bind功能
var test = obj.prop.getFullname.bind(obj.prop);
黄舟2017-04-10 15:18:35
让控制台出现Aurelio De Rosa
在 obj context
调用 getFullname
就能满足你的需求,apply, call, bind
只是具体实现方式,上面已经回答的很好啦。