3

我已经了解到构造函数可以被实例化以在 javascript 中创建新对象,该对象具有自己的 _proto_ 属性,并且还将属性“原型”赋予构造函数。

function MyController() {
    var controllerName = 'initialcontroller';
    function init() {
        console.log(controllerName);
    }
    this.init = init;
}

在这里,init 可以这样调用:

var mycontroller = new MyController();
mycontroller.init();    

假设我只实例化一次并且不再实例化,如果我不打算使用 MyController.prototype 提供的所有原型属性,这不是矫枉过正吗?

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

var myController = function() {
    var controllerName = 'initialcontroller';
    function init() {
        console.log(controllerName);
    }
    return {
        init : init
    }
}();

在这里,init 可以这样调用:

myController.init();

在这种情况下,如果我尝试访问 myController 中不存在的任何属性,javascript 引擎将不会尝试查找该属性是否存在于原型链中的任何位置,从而节省了我的时间。

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

4

1 回答 1

2

如果您只是想要一个带有一些方法和其他属性的“单例”类对象,您可以使用对象文字来进一步简化事情:

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' 实例,这可能会快一点。Object实际上,这种性能影响应该可以忽略不计。除非您真的需要,否则不要尝试在此处进行优化。:)

于 2013-07-08T07:55:02.587 回答