使用 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 语法。