根据Caja论文:
禁止使用的名称。在Firefox中,访问“__proto__”属性 object会授予权限来创建更多像这样的对象 违反最低权威原则。因此,Caja拒绝所有人 以“__”结尾的名称(双下划线)。这也给了Caja 实施一个地方将其簿记信息存储在哪里 对Caja程序员来说是不可见的。
我在Firebug中尝试过,只看到__proto__
所有的方法(即,pkcsll, atob, btoa, screenX
等),但我没有看到复制类型的方法。如何利用__proto__
?
答案 0 :(得分:3)
除非我没有得到他们所说的内容,否则您不需要__proto__
从原始版本的原型创建更多对象。
你可以用标准的ecmascript 5方法做到这一点。
function FooBar() {}
FooBar.prototype.foo = function() { return "bar"; };
/* create a FooBar object */
var fb1 = new FooBar();
/* using __proto__ this creates an object with the same prototype as fb1 */
var fb2 = {};
fb2.__proto__ = fb1.__proto__;
/* and so does this, but without __proto__ */
var fb3 = Object.create(Object.getPrototypeOf(fb1));
fb1 instanceof FooBar; // true
fb2 instanceof FooBar; // true
fb3 instanceof FooBar; // true
答案 1 :(得分:2)
我不会将其称为漏洞,但是在支持__proto__
的JavaScript引擎中,您可以通过以下方式创建与任何对象具有相同原型的对象,
function makeObjectLike(a) {
function maker() { }
maker.prototype = a.__proto__;
return new maker();
}
您也可以使用ES5的Object.getPrototypeOf(a)
代替a.__proto__
执行相同的操作。
Caja禁止发布的内容不是因为它们本身就是坏的,而是因为如果你不相信你正在加载和运行的代码,它们就可能被用于恶意。在您自己的代码中使用这种技术就好了(浏览器兼容性问题除外)。