此函数是否类似于构造函数

Is this function similar to a constructor?

本文关键字:构造函数 类似于 是否 函数      更新时间:2023-09-26
function catRecord(name, birthdate, mother) {
  return {name: name, birth: birthdate, mother: mother};
}

我对构造函数的理解是用于构建对象的函数。

这个 catRecord 函数会算作构造函数吗?

不,您给出的函数返回一个没有类型信息的新关联数组。你所追求的构造函数是这样的:

function fixedCatRecord(name, birthdate, mother) {
    this.name = name;
    this.birthdate = birthdate;
    this.mother = mother;
}

这样,您将拥有一个知道它是固定 CatRecord 的对象,这意味着它可以访问所有适当的元数据(例如知道您可以对其调用哪些方法(。

请注意,它们都可以与"new"一起使用,但它将是 Object 类型的对象(这是关联数组的默认值(,而不是 catRecord 类型的对象。

例如

,如果您使用的是控制台.log提供类型信息的内容(例如 Chrome(:

// this is an Object, not what you want!
console.log(new catRecord("Fluffy", "12/12/12", "Melody"));
// this is a fixedCatRecord, good!
console.log(new fixedCatRecord("Fluffy", "12/12/12", "Melody"));

这个 catRecord 函数会算作构造函数吗?

不。

是的,它与构造函数

非常相似,但我不会将所有返回对象的函数/方法称为"构造函数"。当不涉及继承时,我使用术语工厂

EcmaScript 规范将构造函数简单地定义为

创建和初始化对象的函数对象。

尽管在它下面已经有一个关于原型继承的注释。在语言概述中,它说

构造函数是具有名为"prototype"的属性的函数,用于实现基于原型的继承共享属性

因此,虽然从技术上讲,实现[[construct]]的每个对象都是构造函数,但在 JavaScript 中,术语"构造函数"仅用于旨在与 new 关键字一起使用并创建共享共同prototype(形成"类"(的实例的函数。按照惯例,他们的名字是大写的。

构造函数是一个函数,每当我们 创建类 的实例。

返回对创建实例原型的 Object 函数的引用。请注意,此属性的值是对函数本身的引用,而不是包含函数名称的字符串,但它不是只读的(除了原始布尔值、数字或字符串值:1,true,"只读"(。

如果我们要创建一个Date类的实例,那么:

var e = new Date();
alert(e.constructor); //return Date

然后它的构造函数将返回 Date 类的构造函数名称Date

同样,如果我们像var n = new Number(5);一样创建 Number 的实例,那么它的构造函数将返回 Number,该数字将是构造函数的名称。

参考。

例:

var Vehicle = function Vehicle() {
  // ...
}
var vehicle = new Vehicle();

调用构造函数时会发生什么?
当调用new Vehicle()时,JavaScript 会做四件事:

  1. 它会创建一个新对象。
  2. 它将对象的构造函数属性设置为"车辆"。
  3. 它设置要委托给 Vehicle.prototype 的对象。
  4. 它在新对象的上下文中调用 Vehicle((。
function Employee()  // Class and constructor
{ 
  this.name = "A";
  this.age = "23";
}
var a = new Employee(); // Creating instance
alert(a.name); // alerts A
function Employee(a,b)  // Class and constructor
{ 
  this.name = a;
  this.age = b;
}
var one = new Employee("A",23); // Creating instance
var two = new Employee("B",25); // Creating instance
alert(two.name); // alerts B

希望上面的例子能解释你需要的一切

附加:

如果要将方法添加到类Employee,则应使用prototype

Employee.prototype.printName = function()
{
   document.write(this.name);
};
two.printName();  // Writes B