字面量 vs 构造器 vs class

Object 概述

Object 是 JavaScript 的一种 数据类型 。它用于存储各种键值集合和更复杂的实体。

Objects 可以通过 对象字面量构造函数 或者 class 的方式创建

一、对象字面量 ({…})

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21

let user = {
  name: "Lucy",
  sayHi(){
    console.log(this.name) // Lucy, this指的是“当前的对象”
  }
}

user.sayHi() // Lucy

// 箭头函数
// 这是箭头函数的一个特性,当我们并不想要一个独立的 this,反而想从外部上下文中获取时,它很有用。
let user = {
  name: "Lucy",
  sayHi() {
    let arrow = () => console.log(this.name);
    arrow();
  }
};

user.sayHi(); // Lucy

二、构造器 + new

常规的 {…} (字面量) 语法允许创建一个对象。但是我们经常需要创建许多类似的对象,例如多个用户或菜单项等。

这可以使用构造器(构造函数)和new操作符来实现。

从技术上讲,任何函数(除了箭头函数,它没有自己的 this)都可以用作构造器。
即可以通过 new 来运行,它会执行上面的算法。
首字母大写是一个共同的约定,以明确表示一个函数将被使用 new 来运行。

#. 约定

构造函数在技术上是常规函数。不过有两个约定:

  1. 它们的命名以大写字母开头。
  2. 它们只能由 new 操作符来执行。

#. 实列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

function User(name) {
  // this = {};(隐式创建)

  // 添加属性到 this
  this.name = name;
  this.isAdmin = false;

  // return this;(隐式返回)
}

const val1 = new User("Jack");
console.log(val1) //{name: "Jack", isAdmin: false, constructor: Object}

等同于字面量Object

1
2
3
4
5
6
7

let user = {
  name: "Jack",
  isAdmin: false
}

console.log(user) //name: "Jack", isAdmin: false}

三、class + new

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

class ClassMates{
  constructor(name,age){
    this.name=name;
    this.age=age;
  }
  displayInfo(){
    return this.name + "is " + this.age + " years old!";
  }
}

// 用法:
let classmate = new ClassMates("Mike Will",15);
classmate.displayInfo();  // result: Mike Will is 15 years old!

// 其实class也是一个function
console.log(typeof ClassMates); // function