你会怎么写一个“;构造函数”;

How would you write a "constructor"

本文关键字:一个 构造函数      更新时间:2024-04-04

我一直在讨论"工厂函数"的概念,所以考虑一下:

var HelloWorld = function() {
    return  {
       hello: function() { console.log('hi'); }
    }
}

正如我们所知,它被实例化为:var helloWorld = HelloWorld();这样一个函数的"构造函数"会是它自身的函数吗?有没有什么方法可以让我做:HelloWorld.hello(),而不是像类一样"实例化它"?或者这是另一个概念?

查看以下代码:

var HelloWorldFactory = function(text) {
    return  {
       hello: function() { console.log(text); }
    }
};
var HelloWorld = {
  hello: function() { console.log('hi2'); }
};
var helloWorld = HelloWorldFactory('hi');
helloWorld.hello();
HelloWorld.hello();

正如@Quentin在评论中提到的,通过调用HelloWorldFactory('hi');,您不是在调用js构造函数,而是在调用一个返回对象的函数。

执行HelloWorld.hello();是一个不同的概念,因为您只使用了一个手工定义的对象(它可以通过工厂创建,也可以在代码中定义)

在您的示例中,您将返回一个带有函数属性的对象文字。您也可以直接返回一个函数。但最终这是工厂模式,创建函数的构造函数是Function函数,而不是HelloWorld函数的原型,因为构造函数是这样的。

函数是JS中的纯对象。你可以像对待物体一样对待它们。所以,你可以对他们为所欲为。

function HelloWorld(){};
     HelloWorld.thank = function(){console.log("thanks")};
   HelloWorld.message = "hello";
HelloWorld.sayMessage = function(){console.log(HelloWorld.message)};

然而,构造函数函数略有不同。它们是用new关键字调用的,正如我上面提到的,它们将自己的原型分配给创建的对象。它是JS中最复杂的部分之一。我看到很多人认为new没用,最好避免,应该首选Object.create(),但事实并非如此。构造函数有时非常有用,因为您可以在构建过程中建立令人惊叹的原型关系。

相关文章: