这段代码的构造函数在做什么?

时间:2018-01-12 17:18:50

标签: javascript object javascript-objects

我没有得到以下代码中发生的事情。为什么构造函数被包含在另一个函数中,为什么构造函数和它所包含的函数都给出了相同的名称?为什么封闭函数已被自调用?

var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
}());
var greeter;
greeter = new Greeter("world");
console.log(greeter.greet());

2 个答案:

答案 0 :(得分:2)

您可以将自调用函数视为一种高阶函数,它会返回一些具有某种配置的函数。

好的,那个自我调用功能在做什么?它包含一个构造函数,它们包含一个名为" greeting "的公共属性。从构造函数接收的输入参数,被赋值给greeting。在此签名之后,它会在prototype的帮助下为此构造函数添加一些辅助函数,这将打印问候语消息。

原型是什么意思?它是javascript https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

的主要支柱之一

嘛!我们真的需要一个自我调用功能吗?答案是,不!我们也可以用一种简单的方式编写,就像下面一样,

function Greeter(message) {
    this.greeting = message;
}
Greeter.prototype.greet = function () {
    return "Hello, " + this.greeting;
}; 

var greeter;
greeter = new Greeter("world");
console.log(greeter.greet());

那就是它!并且它将给出如上所述的确切结果。

那为什么那个人使用自我调用功能呢?我相信,酷炫的设计模式总是闪耀着。那家伙有一个计划写一些工厂函数的东西,它会给我一个完全配置的构造函数。在这种情况下,自调用表达式只不过是所谓的工厂。

注意:在您的原始帖子中,最外层的 Greeter 不是真正的函数,它是一个包含某个函数的简单变量,由该自调用块返回。您可以为该变量使用任何名称。

答案 1 :(得分:2)

在这种特殊情况下,将Greeter包裹在一个立即调用的函数(IIFE)中没有意义; Ravindra Thorat是正确的,重写会产生(mostly)等效行为。

当您在匿名立即执行的函数中添加更多内容时,此构造开始有意义,例如strict mode标记或私有变量(以下示例中为GREETING):

var Greeter = (function () {
    "use strict";
    const GREETING = "Hello, ";

    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return GREETING + this.greeting;
    };
    return Greeter;
}());
var greeter;
greeter = new Greeter("world");
console.log(greeter.greet());
// console.log(GREETING) // not defined here -- only available inside the anonymous function

已更新以回复评论:

请注意,最外层变量Greeter的值不是外部匿名(无名)函数本身,而是调用的结果。比较:

var Greeter = (function() {...})() // the returned value is assigned to Greeter
var Greeter = (function() {...})   // the anonymous function without parameters is assigned to Greeter

由于外部匿名函数以return Greeter结尾,因此最外层Greeter变量的值在IIFE内声明的function Greeter(message)

基本上,IIFE内部的所有内容都不可用,除了显式返回的对象(本例中为Greeter(message)构造函数)。