非对象构造函数的用例和语法



当前正在阅读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]]内部方法。

相关内容

  • 没有找到相关文章

最新更新