Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript fetch API处理_proto______________________________?_Javascript_Json_Fetch Api - Fatal编程技术网

Javascript fetch API处理_proto______________________________?

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") .

当我使用fetch获取设置了
\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)