我问 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 函数?
该解决方案基于@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' }));