javascript基础学习系列三百六十八:Request对象

顾名思义,Request 对象是获取资源请求的接口。这个接口暴露了请求的相关信息,也暴露了使
用请求体的不同方式。
注意 与请求体相关的属性和方法将在。

1. 创建 Request 对象

可以通过构造函数初始化 Request 对象。为此需要传入一个 input 参数,一般是 URL:

   let r = new Request('https://foo.com');
    console.log(r);
    // Request {...}

Request 构造函数也接收第二个参数——一个 init 对象。这个 init 对象与前面介绍的 fetch() 的 init 对象一样。没有在 init 对象中涉及的值则会使用默认值:

// 用所有默认值创建 Request 对象 console.log(new Request(''));
// Request {
    //   bodyUsed: false
    //   cache: "default"
    //   credentials: "same-origin"
    //   destination: ""
    //   headers: Headers {}

Fetch API 提供了两种不太一样的方式用于创建 Request 对象的副本:使用 Request 构造函数和使 用 clone()方法。
将 Request 实例作为 input 参数传给 Request 构造函数,会得到该请求的一个副本:

let r1 = new 
Request('https://foo.com');
let r2 = new Request(r1); console.log(r2.url); // https://foo.com/

如果再传入 init 对象,则 init 对象的值会覆盖源对象中同名的值:

let r1 = new Request('https://foo.com');
let r2 = new Request(r1, {method: 'POST'}); console.log(r1.method); // GET
console.log(r2.method); // POST

这种克隆方式并不总能得到一模一样的副本。最明显的是,第一个请求的请求体会被标记为“已使用”:

 //   integrity: ""
//   keepalive: false
//   method: "GET"
//   mode: "cors"
//   redirect: "follow"
//   referrer: "about:client"
//   referrerPolicy: ""
//   signal: AbortSignal {aborted: false, onabort: null}
//   url: "<current URL>"
// }
// 用指定的初始值创建 Request 对象 console.log(new Request('https://foo.com',
                        { method: 'POST' }));
// Request {
//   bodyUsed: false
//   cache: "default"
//   credentials: "same-origin"
//   destination: ""
//   headers: Headers {}
//   integrity: ""
//   keepalive: false
// method: "POST"
//   mode: "cors"
//   redirect: "follow"
//   referrer: "about:client"
//   referrerPolicy: ""
//   signal: AbortSignal {aborted: false, onabort: null}
// url: "https://foo.com/" // }

2. 克隆 Request 对象

   let r1 = new Request('https://foo.com',
                     { method: 'POST', body: 'foobar' });
console.log(r2.bodyUsed); // false 28
let r2 = new Request(r1);
 console.log(r1.bodyUsed); // true

如果源对象与创建的新对象不同源,则 referrer 属性会被清除。此外,如果源对象的 mode 为 navigate,则会被转换为 same-origin。
第二种克隆 Request 对象的方式是使用 clone()方法,这个方法会创建一模一样的副本,任何值 都不会被覆盖。与第一种方式不同,这种方法不会将任何请求的请求体标记为“已使用”:

let r1 = new Request('https://foo.com', { method: 'POST', body: 'foobar' }); let r2 = r1.clone();
    console.log(r1.url);      // https://foo.com/
    console.log(r2.url);      // https://foo.com/
    console.log(r1.bodyUsed); // false
    console.log(r2.bodyUsed); // false

如果请求对象的 bodyUsed 属性为 true(即请求体已被读取),那么上述任何一种方式都不能用来 创建这个对象的副本。在请求体被读取之后再克隆会导致抛出 TypeError。

let r = new Request('https://foo.com'); r.clone();
new Request(r);
// 没有错误
r.text(); // 设置bodyUsed为true
r.clone();
// TypeError: Failed to execute 'clone' on 'Request': Request body is already used
new Request(r);
// TypeError: Failed to construct 'Request': Cannot construct a Request with a Request object that has already been used.

3. 在 fetch()中使用 Request 对象

fetch()和 Request 构造函数拥有相同的函数签名并不是巧合。在调用 fetch()时,可以传入已
经创建好的 Request 实例而不是 URL。与 Request 构造函数一样,传给 fetch()的 init 对象会覆 盖传入请求对象的值:

let r = new Request('https://foo.com');
// 向 foo.com 发送 GET 请求 fetch(r);
// 向 foo.com 发送 POST 请求 fetch(r, { method: 'POST' });

fetch()会在内部克隆传入的 Request 对象。与克隆 Request 一样,fetch()也不能拿请求体已 经用过的 Request 对象来发送请求:

let r = new Request('https://foo.com',
                        { method: 'POST', body: 'foobar' });
r.text();
fetch(r);
// TypeError: Cannot construct a Request with a Request object that has already been used.

关键在于,通过 fetch 使用 Request 会将请求体标记为已使用。也就是说,有请求体的 Request 只能在一次 fetch 中使用。(不包含请求体的请求不受此限制。)演示如下:

let r = new Request('https://foo.com',
                    { method: 'POST', body: 'foobar' });
fetch(r);
fetch(r);
// TypeError: Cannot construct a Request with a Request object that has already been used.

要想基于包含请求体的相同 Request 对象多次调用 fetch(),必须在第一次发送 fetch()请求前 调用 clone():

   let r = new Request('https://foo.com',
                        { method: 'POST', body: 'foobar' });
// 3 个都会成功 19 fetch(r.clone());
fetch(r.clone());
fetch(r);
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript中的对象是一种无序的键/值对集合。您可以使用对象来存储任意数据类型,并且可以使用键来访问这些数据。 创建对象的方式有多种,其中一种是使用对象字面量语法: ``` let obj = { key1: value1, key2: value2, ... }; ``` 您也可以使用构造函数来创建对象: ``` let obj = new Object(); obj.key1 = value1; obj.key2 = value2; ... ``` JavaScript还提供了一种称为原型的机制,可以在一个对象基础上创建新对象。您可以使用Object.create()来创建一个新对象,并将其关联到另一个对象: ``` let obj1 = {key1: value1}; let obj2 = Object.create(obj1); ``` 访问对象中的值可以使用点语法或中括号语法: ``` console.log(obj.key1); console.log(obj['key1']); ``` 对象可以嵌套,创建多级对象 ``` let obj = { key1: { key2: { key3: value } } }; ``` JavaScript还提供了一种称为原型的机制,可以在一个对象基础上创建新对象。 ### 回答2: JavaScript是一种重要的脚本语言,它的强大之处在于它的对象。可以把JavaScript对象看作是创建Web应用程序的基石。 JavaScript对象是一种复合数据类型,由属性和方法组成。每个对象都包含一组属性和方法,它们可以通过对象的名字来调用或者访问。对象可以创造新的属性和方法,也可以从其他对象继承属性和方法。JavaScript提供的对象类型有三种:原始对象、内置对象和宿主对象。 原始对象是指通过原型链创建的对象,它由用户自己定义或系统预定义的对象来创建。内置对象是指由JavaScript语言预定义的对象类型,这些对象JavaScript的核心,在任何JavaScript环境下都可以使用。宿主对象是指由浏览器或服务器环境提供的对象类型,可以用来操作系统、浏览器或者其他外部环境。 对象JavaScript的核心概念之一,所以对于JavaScript初学者来说,学习对象是非常重要的。在学习对象之前,需要先掌握基本的语法和编程概念,例如变量、函数和循环等。在学习对象之后,可以掌握面向对象编程的思想,用对象的方式来组织和管理代码,使得代码更加清晰和易于维护。 总之,学习JavaScript对象是非常重要的,因为它们是JavaScript编程的核心和基石。掌握JavaScript对象可以让你更好地理解JavaScript编程的本质,从而更好地开发Web应用程序。 ### 回答3: JavaScript是一门面向对象语言,它的核心特性之一就是对象JS对象是一组属性的集合,每个属性都由一个字符串和一个值组成,这个值可以是函数。对象可用于封装数据和功能,以及创建可重复使用的代码块,从而实现更高效的编程。 在JavaScript中,对象的创建方式有两种:字面量和构造函数。字面量方式创建对象非常简单,只需要按照对象的键-值对方式来书写,如下所示: ```javascript var person = { name: 'Alice', age: 20, sayHello: function() { console.log("Hello, I'm "+this.name); } } ``` 上述代码中,我们定义了一个名为`person`的对象,它有两个属性`name`和`age`,以及一个方法`sayHello`。使用字面量方式创建对象,我们可以很方便地定义对象的初始状态。 另一种创建对象的方式是构造函数。构造函数本质上是一种特殊的函数,以函数的形式返回一个新的对象,实现对象的构建。`new`操作符用来创建对象的实例,如下所示: ```javascript function Person(name, age) { this.name = name; this.age = age; this.sayHello = function() { console.log("Hello, I'm "+this.name); }; } var person1 = new Person('Bob', 30); var person2 = new Person('Charlie', 40); ``` 在上述代码中,我们创建了一个名为`Person`的构造函数,这个函数接受两个参数`name`和`age`,并将它们赋值给对象的属性。使用`new`操作符创建实例`person1`和`person2`时,会执行构造函数,并返回一个新的对象。 除了创建对象JavaScript还提供了一些内置对象,如`Math`、`Date`、`String`、`Array`等。这些内置对象提供了一些预定义的属性和方法,使得编写JavaScript代码更加高效和简便。 总而言之,理解JavaScript对象及其使用方式是非常重要的,因为大多数JavaScript代码都是围绕对象进行的。只有深入了解对象,才能更好地进行JavaScript编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值