javascript构造函数之间的区别

Difference between javascript constructors

本文关键字:区别 之间 构造函数 javascript      更新时间:2023-09-26

我对使用这些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(); }