当前正在阅读js.info,发现了这个:
"让我们再次注意——从技术上讲,任何函数(箭头函数除外,因为它们没有这个(都可以用作构造函数。它可以与new一起运行,并且它将执行上面的算法。"大写字母优先"是一个共同的协议,以明确一个功能将使用新功能运行">
这是他们包含的功能,但似乎并没有描述他们所描述的内容。我也根本无法让它运行(几个错误(。
// create a function and immediately call it with new
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
};
我很好奇这在实践中会是什么样子,对于不返回/不属于对象的构造函数,存在哪些用例
至于用例:构造函数是事实上的对象工厂。您可能希望在使用new
维护熟悉的构造API的同时,从客户端代码中隐藏复杂/非标准的构造细节。从用new
调用的构造函数中返回任何您喜欢的对象的能力实现了这一点。
更多信息
让我们重新排列您的代码,使其更容易理解(这只是略有不同,因为构造函数现在将具有推断名称'F'
(:
let F = function() {
this.name = "John";
this.isAdmin = false;
// ...other code for user creation
// maybe complex logic and statements
// local variables etc
};
let user = new F; // or `new F();` if you prefer, parens are optional
console.log(Object.getPrototypeOf(user) === F.prototype) // true
当使用new
:调用F
时
- 立即创建一个新对象
o
,其[[Prototype]]设置为引用函数F
的.prototype
属性 - 在调用
F
作为构造函数的持续时间内,F内部的this
值被设置为o
o
的.constructor
属性设置为指向F
- 如果没有显式返回值,则
F
的返回值自动设置为o
大多数构造函数都不会显式返回对象。这是因为使用new
隐式进行调用会创建一个新对象o
,该对象根据原型继承规则进行配置;o
被设置为在构造函数的执行期间使用的this
值,并且如果没有显式返回值,则自动隐式返回o
。
也就是说,程序员可以从构造函数显式地返回他们喜欢的任何对象,这会覆盖并阻止隐式返回。
任何实现[[Construct]]
内部方法的函数都可以用作new
(和super
(的构造函数。
普通函数声明(function foo() { ... }
(和类构造函数(class foo { constructor() {} }
(可以用作构造函数。胖箭头函数、对象文字方法、异步函数和类方法不能用作构造函数,因为它们没有[[Construct]]
内部方法。