繁体   English   中英

在 Javascript 中,我们为什么要使用函数来创建对象?

[英]In Javascript, why do we use functions to make objects?

在 javascript.info 上学习一些关于创建对象的基本课程。

我试图掌握选择制作对象的方式。 因为有很多方法可以做到。 另外,我们为什么要使用函数来创建对象? 为什么我们可以不用构造函数来创建对象呢? 在什么情况下,一种方式优于另一种方式?

以下是三种方式:

1:

let name = "bob";
let age = 24;

let user = {
  name: name,
  age: age,
}

alert(user.name);

2:

function obj(name, age) {
return {
  name: name,
  age: age,
};
}

let user = obj("bob", 24);

alert(user.name);

3:


function User(name, age) {
    this.name = name;
  this.age = age;
}

let user = new User("bob", "24")

alert(user.age);

2 和 3 中的代码实际上不是用于制作蓝图对象的相同目的吗? 谢谢。

1 和 2 创建相同的对象,它们是Object实例。 3 创建一个对象,它是 Instance if User以及Object 使用方法 3,您可以获得实现Inheritance或至少向该类/函数(用户)的所有实例添加通用属性和方法。 例如

 function User(name, age) { this.name = name; this.age = age; } User.prototype.showDetails = function () { console.log(`Name: ${this.name}\\nAge: E${this.age}`); } let user1 = new User("Bob", "24"); let user2 = new User("John", "25"); console.log(user1.showDetails()); console.log(user2.showDetails());

选项 1 创建一个简单的对象。 如果您只想存储一些密钥/数据对,这是一种明智的方法。

选项 2 可让您生成大量相似的对象,但数据略有不同。

选项 3 不是很有用,除非您将它与原型结合起来,以便生成的对象具有方法并利用继承。

选项 3 方法被类语法取代。

您的选项 2 和 3 更像是创建一个类而不是一个对象

问题是,javascript 最近才开始定义类和对象以及实例化对象之类的东西。

为了您的享受,这里是第 4 种方式

class User{
  constructor (name, age) {
    this.name = name
    this.age = age
  }
}

let user = new User("bob", "24")

这种新方法允许您扩展另一个类,从而为您提供适当的继承。

class Person{
   constructor (gender) {
     this.gender=gender
   }
}
class User extends Person{
  constructor (name, age, gender) {
    super(gender)
    this.name = name
    this.age = age
  }
}

let user = new User("bob", "24", 'male')

1 和 2 之间的差异可以忽略不计。

数字 1 是您使用{}语法构建的对象。 第二个是返回您使用{}语法创建的对象的函数。 该函数不是这里过程的一部分,它只是返回一个简单的值,一个对象。

一切都是 javascript 中的对象。 实际上不是,但主要是。 数组是对象,您创建的这些键值对是一个对象(并且对象中的每个值也可以设置为一个对象)。 字符串是对象,FUNCTIONS 是对象。 每个非原始数据类型都是一个对象。

数字 3 是一个类。 仍然是一个对象,但具有类的属性,包括具有构造函数。 一个对象只是一个值和一个数据结构,没有明确的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM