简单构造函数模式
simple Constructor Pattern
我以前使用过oop风格的脚本,并试图获得某种带有javascript的系统。我想尝试最基本的模式,构造函数模式。
因此,我设置了一个名为ImageView的js文件,该文件的构造函数与js文件的名称相匹配。
function ImageView(){
alert( 'this is working');
}
然后我设置了另一个名为Main.js的js文件,它将成为主要的实例化类。
$(document).ready(function(){
var imageViewer = new ImageView();
//ImageView();
});
现在我没有得到的是,我可以调用这个对象ImageView,甚至不需要新的构造函数调用。例如ImageView()。据我所知,这只是另一个全局函数,而不是一个封装类。我正试图摆脱全局垃圾,将我的方法和属性分离到它们自己的类中。我想念她是什么。
其他人已经回答了使用new
和不使用它之间的区别,所以我将回答您完全不同的问题:如何避免JS中的全局变量?
答案是你不能完全。你总是会有至少一个,你可以在其中填充你的其他东西。例如,如果您想要xyz
的"名称空间",您可以执行以下操作:
// global:
var xyz = {}; // or, window.xyz = {} if you are in a browser and want to be more explicit.
// "encapsulated" within the xyz "namespace":
xyz.ImageView = function () { alert("This is working"); };
有一个更好的解决方案:使用JavaScript模块的新兴概念。这些不是语言功能(至少在当前版本的JavaScript中不是),所以它们实际上只是由非常聪明的库引入的技巧,这些库覆盖了几个全局变量,可以避免创建比这些库提供的更多的全局变量。一个很好的例子是RequireJS,您可以在其中执行以下操作:
// In xyz.js, define the xyz module (name automatically derived from filename).
// Whatever is returned from the function you pass to define is "the xyz module"
define(function () {
return {
ImageView: function () { alert("This is working"); }
};
});
// In other code, in a different file, you can say "I require the xyz module
// to do my work," and pass require a function saying "once you've got the xyz module
// for me, here's the work I will do with it".
require(["xyz"], function (xyz) { // dependency array maps to callback arguments
// I got the xyz module, including the ImageView function it exported. Use it!
var imageViewer = new xyz.ImageView();
});
在这里,RequireJS引入的聪明的全局变量是函数define
和require
,但如果你正确使用它们,你可以避免在这两个函数之外再引入任何全局变量。
在ImageView
内部,如果用new
调用this
,则其值将不同。没有,它只是另一个功能。使用new
,它将创建一个新的ImageView
实例并将其绑定到变量this
。
首先,JavaScript没有内置的名称空间。它只能被模拟。您还必须包含计划使用的每个javascript文件。
只调用ImageView()
,基本上调用this
上的构造函数,这是下一级作用域。
使用new ImageView()
创建构造函数ImageView的新Object,this
指向新实例。
JavaScript是一种类型松散的原型语言。
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- 日志记录时避免 Promise 构造函数反模式
- 用于初始化对象的编码模式 - 构造函数(新)与 Object.create()(Crockford)
- 如何在 Crockford 的新构造函数模式中共享“构造函数”功能
- 构造函数模式和原型模式之间的区别
- 使用构造函数显示模块模式
- IIFE创建模式-但如何支持构造函数参数
- json模式的构造函数
- AngularJS设计模式:我应该使用工厂来创建构造函数吗
- 为什么实用模块&构造函数模式将其作为全局接受
- 使用这种JavaScript编码模式来定义构造函数的优点是什么
- 使用RegExp构造函数的具有可变模式的JavaScript正则表达式
- 带有私有变量的JavaScript构造函数模式
- JavaScript 中构造函数的静态方法模式
- 模块模式中的构造函数
- JavaScript 构造函数模式
- 构造函数模式下的自执行函数
- 理解构造函数调用模式中的“this”
- 为什么我的JavaScript构造函数模式不能工作?
- 如何使用promise .all来避免promise构造函数反模式