根据克罗克福德的说法,由于安全问题,最好的做法是不要使用这个指针。
我在余烬指南里发现了这个,
Person = Ember.Object.extend({
say: function(thing) {
var name = this.get('name');
alert(name + " says: " + thing);
}
});
Soldier = Person.extend({
say: function(thing) {
this._super(thing + ", sir!");
}
});
var yehuda = Soldier.create({
name: "Yehuda Katz"
});
yehuda.say("Yes"); // alerts "Yehuda Katz says: Yes, sir!"在这种代码情况下,如何避免这种情况?
发布于 2015-06-01 18:34:57
由于安全性问题,最佳实践是不使用此指针。
不完全同意。他的论点是,您不能在不安全的环境中信任this,因为它是由调用方决定的。这都是关于封装,以及您的方法只做您希望它们做的事情的安全性。确实使用this的方法可能会被骗去做其他的事情。
考虑一下
function Person(name) {
this.name = name;
this.say = function(thing) {
alert(this.name+" says: "+thing);
};
}
var p = new Person("John");
p.say("this is unsafe");访问p的恶意调用者可以执行以下操作
p.say.call({name: "Douglas"}, "this is totally safe");(假设他无法访问alert,并假定他不想简单地更改p.name)
一个更安全的构造函数应该是
function Person(name) {
return {
say: function(thing) {
alert(this.name+" says: "+thing);
}
};
}因此,当一个恶意代理被传递给Person("John")时,他只能让John说些什么。
在这种代码情况下,如何避免这种情况?
不用谢。成员拥抱this,它是非常有用的,你应该使用它,因为你应该被框架。
发布于 2015-06-01 18:33:50
在你提到的视频中,克罗克福德说,在实现JavaScript沙箱以允许第三方代码安全运行的具体情况下,使用JavaScript会导致安全性差,例如,Facebook允许广告在Facebook页面上运行自己的JavaScript,而不损害用户的安全。从代码中删除this是防止代码访问window对象的简单方法,在这种沙箱环境中这是必要的。
他并不是说this在一般情况下会导致安全性差,而只是在沙箱的情况下。
他确实说,自从使用这样的系统后,他已经停止在自己的代码中使用this,但他没有详细说明这一点,而且这也不是关于一般JavaScript安全性的评论。
https://stackoverflow.com/questions/30579660
复制相似问题