javascript:构造函数与一次性显示模块模式

javascript:构造函数与一次性显示模块模式,javascript,constructor,revealing-module-pattern,Javascript,Constructor,Revealing Module Pattern,我逐渐了解到,可以实例化构造函数来创建javascript中的新对象,javascript具有自己的_proto_属性,并且还可以将属性“prototype”赋予构造函数 function MyController() { var controllerName = 'initialcontroller'; function init() { console.log(controllerName); } this.init = init; } 在这

我逐渐了解到,可以实例化构造函数来创建javascript中的新对象,javascript具有自己的_proto_属性,并且还可以将属性“prototype”赋予构造函数

function MyController() {
    var controllerName = 'initialcontroller';
    function init() {
        console.log(controllerName);
    }
    this.init = init;
}
在这里,init可以这样调用:

var mycontroller = new MyController();
mycontroller.init();    
myController.init();
假设我只实例化了一次,而且再也没有实例化过,如果我不打算使用MyController.prototype提供的所有原型属性,这难道不是一种过分的做法吗

问题:相反,我可以不使用显示模块模式编写这样的代码吗

var myController = function() {
    var controllerName = 'initialcontroller';
    function init() {
        console.log(controllerName);
    }
    return {
        init : init
    }
}();
在这里,init可以这样调用:

var mycontroller = new MyController();
mycontroller.init();    
myController.init();
在这种情况下,如果我尝试访问myController中不存在的任何属性,javascript引擎将不会尝试查找该属性是否存在于原型链中的任何位置,从而节省我的时间

或者实例化我忽略的函数还有其他好处吗?

如果您只是想要一个具有某些方法和其他属性的类似“单例”的对象,您可以使用对象文字来简化更多内容:

var myController = {
    init: function (foo) {
        // do something with foo or whatever
    }
}

myController.init("bar");
或者-如果您需要一些“私有”内部状态,请使用常规模块模式:

var myController = (function () {
    var internal = "i am private";
    return {
        init: function () {
            // blah blah
        }
    };
}());

myController.init();

关于原型查找时间:是的,理论上,当您试图访问一个不存在的属性时,查找会遍历原型链。理论上,对于没有特定构造函数的普通ol'
对象
实例,这可能会快一点点。实际上,这种性能影响应该可以忽略不计。除非您真的需要,否则不要尝试在此处进行优化。:)

是的,您可以使用显示模块模式编写这样的代码。这是完全正确的。还有,我想是较短的代码。