在JavaScript中,如何使用__proto__属性创建更多对象?

时间:2012-05-06 00:23:40

标签: javascript prototype

根据Caja论文:

  

禁止使用的名称。在Firefox中,访问“__proto__”属性   object会授予权限来创建更多像这样的对象   违反最低权威原则。因此,Caja拒绝所有人   以“__”结尾的名称(双下划线)。这也给了Caja   实施一个地方将其簿记信息存储在哪里   对Caja程序员来说是不可见的。

我在Firebug中尝试过,只看到__proto__所有的方法(即,pkcsll, atob, btoa, screenX等),但我没有看到复制类型的方法。如何利用__proto__

2 个答案:

答案 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禁止发布的内容不是因为它们本身就是坏的,而是因为如果你不相信你正在加载和运行的代码,它们就可能被用于恶意。在您自己的代码中使用这种技术就好了(浏览器兼容性问题除外)。