你会怎么写一个“;构造函数”;
How would you write a "constructor"
我一直在讨论"工厂函数"的概念,所以考虑一下:
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()
,但事实并非如此。构造函数有时非常有用,因为您可以在构建过程中建立令人惊叹的原型关系。
相关文章:
- 当一个重要的构造函数参数丢失时应该发生什么
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 如何将对象引用传递到 mootools 中另一个对象的构造函数中
- 如何在构造函数中创建一个简单的DOM元素,并在调用时将其附加到元素中
- 你会怎么写一个“;构造函数”;
- Javascript:如何附加到构造函数的原型,如果该构造函数已经在另一个对象的原型上定义
- 在 JavaScript ES2015 中,在扩展类时,我们是否需要显式创建一个新的构造函数,或者我们是否可以只使用父类
- Javascript:创建一个对象构造函数
- 在ES2015中定义一个类,构造函数方法是什么以及为什么它是必不可少的
- 如何定义一个构造函数,该函数使用 getter 和 setter 创建对象
- 当返回另一个构造函数时,从Javascript构造函数返回this的值
- 从另一个构造函数继承会覆盖继承的构造函数的原型链中的现有属性
- 为jQuery插件编写一个构造函数
- 一个构造函数,其对象隐藏/显示一个html元素
- 在Jasmine中,describe部分是对应于一个方法,还是通常对应于一个构造函数?
- React - Firebase - GoogleAuthProvider不是一个构造函数
- 一个构造函数的属性是否可能被另一个构造函数继承?
- 创建一个构造函数和适配器来读取xml
- 您可以将一个构造函数的原型分配给另一个构造函数吗?
- javascript构造函数.继承另一个构造函数的原型