【问题标题】:In Javascript, why do we use functions to make objects?在 Javascript 中,为什么我们使用函数来制作对象?
【发布时间】:2020-01-15 18:09:26
【问题描述】:

在 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 中的代码实际上不是用于制作蓝图对象的相同目的吗?谢谢。

【问题讨论】:

标签: javascript function object methods


【解决方案1】:

1 和 2 创建相同的对象,它们是 Object 的实例。如果UserObject 3,则创建一个实例对象。使用方法 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());

【讨论】:

    【解决方案2】:

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

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

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

    选项 3 方法已被 class syntax 取代。

    【讨论】:

    • “选项 3 不是很有用” - 稍等一下,我在调试时节省的所有时间仅仅是因为我可以看到出现在意外位置的特定对象是MySpecialClass 而不是一些不起眼的Object, ctor 函数本身就很值钱,恕我直言。
    【解决方案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')
    

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-03-19
        • 2015-12-05
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多