在JavaScript中,如何使用_proto__属性来创建更多对象?
根据Caja文件: 禁用名称。在Firefox中,访问 对象将授予创建更多类似它的对象的权限 违反了权力最小的原则。因此,Caja拒绝接受所有建议 以“u u”(双下划线)结尾的名称。这也给了Caja 实现一个存储其簿记信息的地方 对Caja程序员来说是看不见的在JavaScript中,如何使用_proto__属性来创建更多对象?,javascript,prototype,Javascript,Prototype,根据Caja文件: 禁用名称。在Firefox中,访问 对象将授予创建更多类似它的对象的权限 违反了权力最小的原则。因此,Caja拒绝接受所有建议 以“u u”(双下划线)结尾的名称。这也给了Caja 实现一个存储其簿记信息的地方 对Caja程序员来说是看不见的 我在Firebug中尝试过,只是看到了\uuu proto\uuu拥有的所有方法(即pkcsll、atob、btoa、screenX等),但我没有看到复制类型的方法。\uuuuu proto\uuuu是如何被利用的?除非我没有理解他们的
我在Firebug中尝试过,只是看到了
\uuu proto\uuu
拥有的所有方法(即pkcsll、atob、btoa、screenX
等),但我没有看到复制类型的方法。\uuuuu proto\uuuu
是如何被利用的?除非我没有理解他们的意思,否则你不需要\uuuuu proto\uuuu
从原始原型的同一原型创建更多的对象
您可以使用标准的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
除非我不明白他们在说什么,否则你不需要
\uuuuu proto\uuuu
从原始的同一原型创建更多的对象
您可以使用标准的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
我不会确切地称之为利用漏洞,但在支持
\uuuuu proto\uuuuu
的JavaScript引擎中,您可以通过以下方式创建与任何对象具有相同原型的对象:
function makeObjectLike(a) {
function maker() { }
maker.prototype = a.__proto__;
return new maker();
}
您也可以使用ES5的对象.getPrototypeOf(a)
而不是a.来做同样的事情
Caja禁止这些东西,不是因为它们本质上是坏的,而是因为如果您不信任正在加载和运行的代码,它们可能被用于邪恶。在您自己的代码中使用这种技术是很好的(除了浏览器兼容性问题)。我不会确切地说这是一种利用漏洞的行为,但是,在支持\uuuuuuuuuuuuuuuuuuuuuuuu
的JavaScript引擎中,您可以通过以下方式创建与任何对象具有相同原型的对象:
function makeObjectLike(a) {
function maker() { }
maker.prototype = a.__proto__;
return new maker();
}
您也可以使用ES5的对象.getPrototypeOf(a)
而不是a.来做同样的事情
Caja禁止这些东西,不是因为它们本质上是坏的,而是因为如果您不信任正在加载和运行的代码,它们可能被用于邪恶。在您自己的代码中使用这种技术很好(除了浏览器兼容性问题)