Javascript fetch API处理_proto______________________________?
当我使用fetch获取设置了Javascript fetch API处理_proto______________________________?,javascript,json,fetch-api,Javascript,Json,Fetch Api,当我使用fetch获取设置了\uuuuu proto\uuuu的有效负载时,它似乎没有像分配给对象那样将其应用于对象原型 这很好,因为这意味着对象原型永远不会被API调用污染,但我有点搞不清楚为什么/如何工作 例如,如果我有一个payload.json: { "__proto__": { "toString": "foobar" } } 然后取这个: fetch("payload.json") .
\uuuuu proto\uuuu
的有效负载时,它似乎没有像分配给对象那样将其应用于对象原型
这很好,因为这意味着对象原型永远不会被API调用污染,但我有点搞不清楚为什么/如何工作
例如,如果我有一个payload.json
:
{
"__proto__": { "toString": "foobar" }
}
然后取这个:
fetch("payload.json")
.then(function(response) {
return response.json();
})
.then(function(json) {
// JSON from a fetch payload
console.log("--JSON from a fetch payload--");
console.log("payload.toString():", json.toString()); // [object Object]
console.log("json.__proto__:", json.__proto__); // {toString: "foobar"}
console.log("{}.toString()", {}.toString()); //[object Object]
//New object with __proto__ set
console.log("--New object with __proto__ set--");
const x = { __proto__: { toString: () => "hacked" } };
console.log("x.toString(): ", x.toString());
console.log("{}.toString(): ", {}.toString());
console.log(
"JSON.parse('{}').toString(): ",
JSON.parse("{}").toString()
);
// Set proto with assignment
console.log("--Set proto with assignment--");
const y = {};
y.__proto__.toString = () => "polluted";
console.log("y.toString(): ", y.toString());
console.log("x.toString(): ", x.toString());
console.log("{}.toString(): ", {}.toString());
console.log(
"JSON.parse('{}').toString(): ",
JSON.parse("{}").toString()
);
});
您将获得以下输出:
--JSON from a fetch payload--
payload.toString(): [object Object]
json.__proto__:
Object {toString: "foobar"}
{}.toString() [object Object]
--New object with __proto__ set--
x.toString(): *** hacked ***
{}.toString(): [object Object]
JSON.parse('{}').toString(): [object Object]
--Set proto with assignment--
y.toString(): *** polluted ***
x.toString(): *** hacked ***
{}.toString(): *** polluted ***
JSON.parse('{}').toString(): *** polluted ***
我理解为什么上一个示例会污染对象原型,但为什么在来自fetch api调用时,json的处理方式会有所不同
上面的例子可以在上看到,实际上,这与
fetch
API无关
\uuuu proto\uuuu
是对象的getter/setter属性。prototype
,它将[[Get]]
和[[Set]]
操作分别转换为[[GetPrototypeOf]]
和[[SetPrototypeOf]]]
当您fetch
数据并将其解析为JSON时,其行为与JSON相同。parse
:解析JSON,然后创建一个空JS对象,并将属性放在其上
但是,它们将属性[[Define]]
而不是[[Set]]]
-ting它们,因此它们不会触发setter,结果是一个名为\uu proto\uuu
的常规属性指向其[[Prototype]
的另一个对象:
请看以下示例:
//使用[[Set]],您认为
常量obj1={}
obj1.\uuuuuuuuuuuuuuuuj1.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuj1.{}
console.log(obj1.hasOwnProperty(“\uuuu proto\uuuu”)//false,因为它是继承的
console.log(obj1.\uuuu proto\uuuu==Object.getPrototypeOf(obj1))//true
//使用[[Define]],JSON.parse的工作方式
常量obj2={}
Object.defineProperty(obj2,'.\u proto'.\u'{
值:{},
可枚举:正确,
对,,
可写:对
})
console.log(obj2.hasOwnProperty(“”\uuuuu proto\uuuu')//true,它是自己的
console.log(obj.\uuu proto\uuu==Object.getPrototypeOf(obj))//false
JSON.parse({{code>proto}:{}}}})的功能与JSON.parse({{code>proto}:{}})的功能相同。您可以使用const o=Object.create(null);o.{uu-proto}
或const o={};Object.defineProperty(o,{uu-proto},{value:{},enumable:true,configurable:true)