6
function catRecord(name, birthdate, mother) {
  return {name: name, birth: birthdate, mother: mother};
}

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

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

4

4 回答 4

1

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

没有。

它与构造函数非常相似,是的,但我不会调用所有返回对象“构造函数”的函数/方法。当不涉及继承时,我使用术语工厂代替。

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

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

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

构造函数是一个具有名为“<code>prototype”的属性的函数,用于实现基于原型的继承共享属性

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

于 2013-07-26T11:00:28.230 回答
1

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

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

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

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

例如,如果您正在使用 console.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"));
于 2013-07-26T11:05:23.413 回答
0

构造函数是一个函数,每当我们创建类的实例时都会自动调用它。

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

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

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

然后它的构造函数将返回DateDate的构造函数的名称。

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

参考

例子:

var Vehicle = function Vehicle() {
  // ...
}

var vehicle = new Vehicle();

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

  1. 它创建一个新对象。
  2. 它将对象的构造函数属性设置为 Vehicle。
  3. 它设置对象以委托给 Vehicle.prototype。
  4. 它在新对象的上下文中调用 Vehicle()。
于 2013-07-26T10:52:55.560 回答
-1
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
于 2013-07-26T10:59:33.400 回答