如何修改JavaScript Request对象属性?

问题描述 投票:0回答:1

我问 ChatGPT,他给出了这个代码:

const originalRequest = new Request("https://example.com", {
  method: "GET",
  redirect: "follow",
  headers: { "Content-Type": "application/json" }
});

const newRequest = new Request(originalRequest.url, {
  method: originalRequest.method,
  headers: originalRequest.headers,
  body: originalRequest.body,
  mode: originalRequest.mode,
  credentials: originalRequest.credentials,
  cache: originalRequest.cache,
  referrer: originalRequest.referrer,
  referrerPolicy: originalRequest.referrerPolicy,
  integrity: originalRequest.integrity,
  keepalive: originalRequest.keepalive,
  signal: originalRequest.signal,
  redirect: "manual"  // Changed redirect field here
});

这有点难看,当我问如何使用内省时,他回答说不可能。但由于 chatGPT 总是给出错误的答案,我尝试使用此代码从 Request 对象获取所有属性,但它不起作用:

const request = new Request("https://example.com", {
  method: "GET",
  redirect: "follow",
  headers: { "Content-Type": "application/json" }
});

console.log(Object.getOwnPropertyNames(request));
// []

所以我想知道是否有任何方法可以从 Request 对象获取 props,这样你就可以创建更干净、更通用的克隆 Request 函数?

javascript request
1个回答
0
投票

该解决方案基于@DavidT 回答此问题的代码:

是否可以获取对象的不可枚举继承属性名称?

似乎有效,但接受的答案却无效。该代码使用

Object.getPrototypeOf
并从中获取密钥。

这是创建 Request 对象的新副本并修改所需属性的完整代码。

const request = new Request('https://example.com', {
    method: 'GET',
    redirect: 'error',
    headers: { 'Content-Type': 'application/json' }
});

function clone(req, options) {
   const props = Object.assign(to_object(req), options);

   return new Request(req.url, props);
}

function to_object(req) {
   const pairs = keys(req).map(key => {
     return [key, req[key]];
   });
   return Object.fromEntries(pairs);
}

function keys(obj) {
    const proto = Object.getPrototypeOf(obj);
    return Reflect.ownKeys(proto).filter(prop => {
       // we don't want functions in our final object
       return prop && typeof obj[prop] !== 'function';
    });
}

console.log(request);
console.log(clone(request, { redirect: 'follow' }));

© www.soinside.com 2019 - 2024. All rights reserved.