javascript构造函数之间的区别
Difference between javascript constructors
我对使用这些javascript初始化中的哪一个(如果有的话)有点困惑,因为据我所知,它们都做同样的事情。在某些情况下,我应该使用其中一个还是另一个?Mt项目要求我将几个函数和名称空间封装在一个对象中,这样我们就不会用变量名混淆全局范围,特别是我不清楚+function(){}()之间的区别;和(function())();
如有任何帮助,我们将不胜感激。请记住,最终目标是将我们所有的函数封装在一个名称空间中。IE MyCompany.function,MyCompany.Namepsace.function…
<script>
var Ford = {};
+function() {
Ford.start = function() {
console.log("Ford just started");
};
}();
Ford.start();
</script>
<script>
var Honda = {};
(function() {
Honda.start = function() {
console.log("Honda just srtarted");
};
})();
Honda.start();
</script>
<script>
var Toyota = function() {
return {
start: function() {
console.log("Toyota just strted");
}
};
}
var car = new Toyota();
car.start();
</script>
Javascript函数仅在使用new
关键字时作为构造函数调用。new
创建一个新的对象实例,从构造函数的原型继承,并使this
关键字的上下文成为新创建的对象实例。因此,如果您不使用原型来继承属性,也不使用关键字this
来在构造函数中创建新属性,那么您实际上不需要使用构造函数。
我认为您正在寻找的是使用立即调用的函数实现的模块模式。前两个示例都使用了立即调用的函数。我认为样式(function(){}());
比+function(){}();
更可取。周围的()
和+
都会导致javascript解析器期望一个函数表达式,而不是的函数声明并且这允许后面的()
调用该函数。除了可读性稍差之外,CCD_ 10还可以改变函数的返回值。
我想你想要一些变化(从链接复制):
var MODULE = (function () {
var module = {};
var privateVariable = 1;
function privateMethod() {
// ...
}
module.moduleProperty = 1;
module.moduleMethod = function () {
// ...
};
return module;
}());
虽然所有这些都是有效的JS,但你的假设让我相信你可能不了解JS是如何工作的。前两个例子根本不是通常意义上的构造函数。。。它们是一种模块模式,但甚至不是。你可以把它浓缩成
var Honda = {};
Honda.start = function() { console.log("Honda just started"); }
忘记了自我执行功能。上面显示的内容类似于其他语言中的static
函数:
public class Honda {
public static void start() { Console.WriteLine("Honda Just Started"); }
}
如果您想要一个实例函数,您需要附加到原型,或者附加到构造函数中的this
关键字:
原型:
var Honda = function() {}
Honda.prototype.start = function() { console.log("Honda just started"); }
此:
var Honda = function() {
this.start = function(){
console.log("Honda just started");
}
}
你的最后一个例子,丰田表明你对函数构造函数的工作方式有一个根本的误解。你的对象被丢弃了,作为回报,你得到了一些可以写的对象文字:
var Toyota = {
start: function(){
console.log("Toyota just started");
}
}
你(可能)想要的是我在上面的本田例子中解释的"这个"模式:
var Toyota = function() {
this.start = function() {
console.log("Toyota just started");
}
}
最后,在编写"名称空间"函数库时,模块模式可能是您最好的朋友。这使您可以在不需要正式构造函数/原型等的情况下维护私有状态:
var MyCompany = {};
//car module
(function(ns){
var module,
_isStarted;
function start() { console.log('start'); _isStarted = true; }
function stop() { console.log('stop'); _isStarted = false; }
function isStarted() { return _isStarted; }
module = {
start: start,
stop: stop,
isStarted: isStarted
}
ns.CarModule = module;
}(MyCompany));
//use:
MyCompany.CarModule.start();
if(MyCompany.CarModule.isStarted()) { MyCompany.CarModule.stop(); }
- 全局变量和全局对象的属性之间有什么区别吗
- JavaScript中的函数和对象之间没有区别吗?
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- javascript函数的:和=之间的区别
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 函数中this和var之间的区别
- “util.inherits”和在NodeJS中扩展原型之间的区别
- Math.min()和Math.max()之间有什么区别?在Javascript中
- webpack开发模式和生产构建模式之间有什么区别
- servlet和代理servlet之间的区别
- Javascript 类型未定义和 void 之间的区别
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 布局引擎和javascript引擎之间的区别
- 什么's extjs中的mon()和on()之间的区别
- type=text/javascript和language=javascript之间的区别
- 函数()和新函数()之间的区别
- JavaScript中let和var之间的区别
- 蓝鸟的done()和spread()之间的区别
- Node.js HTTP/NET——连接和请求之间的区别