新关键字

使用 new 调用函数会用被调用的函数创建一个新对象,如下所示: “构造函数”调用该方法:

function MyFunction() {}
const myObject = new MyFunction();

typeof myObject;
> "object"`

这让“构造函数”提供一个模板,用于 对象:

function MyFunction() {
  this.myProperty = true;
}
const myObject = new MyFunction();

myObject.myProperty;
> true

构造函数中 this 的值 函数就会引用正在创建的对象 属性和方法。这样一来, 创建包含数据值和操作所需的任何方法的对象 将数据视为单个便携单元,这个概念称为“封装”:

function MyFunction( myArgument ) {
    this.myValue = myArgument;
    this.doubleMyValue = () => myArgument * 2;
}
const myObject = new MyFunction( 10 );

myObject.myValue;
> 10

myObject.doubleMyValue();
> 20

this 引用当前执行 函数的上下文,这意味着构造函数函数遵循相同的 与任何其他函数一样,应用 this 值的规则。例如,一个函数 作为构造函数使用全局绑定 在单独调用时为 this 的值指定以下值:

function MyFunction() {
    console.log( this  );
}
const myObject = new MyFunction();
> MyFunction { }

MyFunction(); // Global `this` binding outside of strict mode is `globalThis`
> Window {  }

(function() {
    "use strict";
    function MyFunction() {
            console.log( this );
    }
    MyFunction();  // Global `this` binding inside of strict mode is `undefined`
}());
> undefined

通常的做法是将构造函数函数 使用 JavaScript 内置 API 所确定的命名模式, 工厂函数。虽然您有时会发现这两个术语可以互换使用, 构造函数 - 旨在作用于新构造的 对象(使用 new 关键字调用时),它与“factory”不同 函数”该行为明确 return 对象:

function myFunction( myArgument = false ) {
  return { "myProperty" : myArgument };
}
const myObject = myFunction( true );

myObject;
> Object { myProperty: true }

虽然基本原理是相同的,但自定义 构造函数越丰富越好, ES6 中引入的 Class 语法。