javascript - js 这个aop里的 this 劫持 什么意思
PHPz
PHPz 2017-04-11 12:27:33
[JavaScript讨论组]


这里的 beforefn.apply(this,arguments); this 改为 window或null可以吗?

function a() {
console.log('self');
}

var obj = {
name:'li',
getName: function() {
    console.log(this.name);
}
}

Function.prototype.before = function(beforeFn) {
var __self = this;
return function() {
    beforeFn.apply(this,arguments);
    __self.apply(this,arguments)
}
}

var b = a.before(obj.getName);
b();

如果我想 通过a.before执行obj.getName 得到 'li' 这个值,如何处理这套程序?现在这套before程序执行结果,无法获得obj.name的值

PHPz
PHPz

学习是最好的投资!

全部回复(1)
阿神

不行,this需要根据执行的宿主确定,有可能是windows,也有可能是某个对象。

var funcA = function() {
  console.log('a');
};
var funB = function() {
  console.log(this.b)
};
var b = '我是window中的b';
var objB = {b: '我是objB中的b'};
var test1 = funcA.before(funB);
test1(); // 输出`我是window中的b`, 因为这个时候this指向的是windows
objB.test1 = test1;
objB.test1(); // 输出`我是objB中的b`, 因为这个时候this指向的是objB

如果按照你说的将this改为window,那么this将永远指向windowobjB.test1()得到的结果将是我是window中的bthis就被劫持了。


后面的需求,动态设置this指向

var b = a.before(obj.getName).bind(obj);
b(); 
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号