在 JavaScript 中,类是语法糖,在我们的例子中,在原型链上定义了 Student 类中的 sayHello 方法。考虑到每次我们创建 Student 类的实例时,都会将 sayHello 属性设置为该实例,使其成为返回字符串 Hello 的 function,因此我们永远不会使用原型链上定义的函数,也就永远不会看到消息 Hello from Student 。
3.对象可变性
思考以下情况中每个部分的输出:
- // situation 1
- const user = {
- name: 'John',
- surname: 'Doe'
- }
-
- user = {
- name: 'Mike'
- }
-
- console.log(user);
-
- // situation 2
- const user = {
- name: 'John',
- surname: 'Doe'
- }
-
- user.name = 'Mike';
- console.log(user.name);
-
- // situation 3
- const user = {
- name: 'John',
- surname: 'Doe'
- }
-
- const anotherUser = user;
- anotherUser.name = 'Mike';
- console.log(user.name);
-
- // situation 4
- const user = {
- name: 'John',
- surname: 'Doe',
- address: {
- street: 'My Street'
- }
- }
-
- Object.freeze(user);
-
- user.name = 'Mike';
- user.address.street = 'My Different Street';
- console.log(user.name);
- console.log(user.address.street);
说明
Situation 1: 正如我们在上一节中所了解的,我们试图重新分配不允许使用的 const 变量,所以将会得到类型错误。
控制台中的结果将显示以下文本:
- Uncaught TypeError: Assignment to constant variable
Situation 2: 在这种情况下,即使我们改用关键字 const 声明的变量,也会有不同的行为。不同之处在于我们正在修改对象属性而不是其引用,这在 const 对象变量中是允许的。
控制台中的结果应为单词 Mike。
Situation 3: 通过将 user 分配给 anotherUser 变量,可以在它们之间共享引用或存储位置(如果你愿意)。换句话说,它们两个都会指向内存中的同一个对象,因所以更改一个对象的属性将反映另一个对象的更改。
控制台中的结果应为 Mike。
Situation 4: 在这里,我们使用 Object.freeze 方法来提供先前场景(Situation 3)所缺乏的功能。通过这个方法,我们可以“冻结”对象,从而不允许修改它的属性值。但是有一个问题!它只会进行浅冻结,这意味着它不会保护深层属性的更新。这就是为什么我们能够对 street 属性进行更改,而 name 属性保持不变的原因。
控制台中的输出依次为 John 和 My Different Street 。
4.箭头函数
运行以下代码段后,将会输出什么以及原因:
- const student = {
- school: 'My School',
- fullName: 'John Doe',
- printName: () => {
- console.log(this.fullName);
- },
- printSchool: function () {
- console.log(this.school);
- }
- };
-
- student.printName();
- student.printSchool();
说明
控制台中的输出将依次为 undefined 和 My School。
你可能会熟悉以下语法:
- var me = this;
- // or
- var self = this;
-
- // ...
- // ...
- // somewhere deep...
- // me.doSomething();
你可以把 me 或 self 变量视为父作用域,该作用域可用于在其中创建的每个嵌套函数。
当使用箭头函数时,这会自动完成,我们不再需要存储 this 引用来访问代码中更深的地方。箭头函数不绑定自己,而是从父作用域继承一个箭头函数,这就是为什么在调用 printName 函数后输出了 undefined 的原因。
5.解构
请查看下面的销毁信息,并回答将要输出的内容。给定的语法是否允许,否则会引发错误?
- const rawUser = {
- name: 'John',
- surname: 'Doe',
- email: 'john@doe.com',
- displayName: 'SuperCoolJohn',
- joined: '2016-05-05',
- image: 'path-to-the-image',
- followers: 45
- }
-
- let user = {}, userDetails = {};
- ({ name: user.name, surname: user.surname, ...userDetails } = rawUser);
-
- console.log(user);
- console.log(userDetails);
说明
尽管有点开箱即用,但是上面的语法是允许的,并且不会引发错误! 很整洁吧?
(编辑:ASP站长网)
|