构造函数与闭包?

Apr*_*ion 5 javascript constructor closures

使用构造函数创建的这两个对象到底有什么不同ab

该属性__proto__对于使用闭包无法实现的任何内容都有用吗?我应该在不同情况下使用这些技术吗?内存使用量有差异吗?

(jsFiddle)

window.MODULE = {};

MODULE.constructor = function(){
        this.publicVariable = 10;
};
MODULE.constructor.prototype.publicMethod = function(){
    return this.publicVariable;
};
//-------------------------------//
MODULE.closure = (function(){
    var publicMethod = function(){
        return this.publicVariable;
    };
    return function(){
        var obj = {};
        obj.publicVariable = 10;
        obj.publicMethod = publicMethod;
        return obj;
    };
}());
//-------------------------------//
var a = new MODULE.constructor();
console.log("constructor", a.publicMethod(), a)
var b = MODULE.closure();
console.log("closure", b.publicMethod(), b)
Run Code Online (Sandbox Code Playgroud)

还可以看到一个更复杂的jsFiddle与一些私有和静态属性的比较 - 两种技术的工作方式相同,据我所知...

hug*_*omg 6

粗略地说,主要优点原型继承(你的"构造"的方法)是更容易做到的子类的monkeypatching(添加方法到现有的类),同时关闭,如果你想很不错私有实例变量和方法("保护法"是仍然很难用这两种方法)或者更喜欢词法作用域而不是用"this"进行动态作用(如果有人这样做很有用setTimeout(obj.method, 1000))

至于性能,原型继承可以更有效,因为实现已经调整到它,但除非你从该类实例化大量对象,否则它确实无关紧要.


私有变量示例:

var counter  = function(){
   var count = 0; //private variable

   var increment = function(){ // private method
      count ++;
   };

   return { //public interface
      next: function(){
         increment();
         return count;
      },
   }
}

var c = counter();
console.log(c.next());
console.log(c.next());
Run Code Online (Sandbox Code Playgroud)


Pav*_*vlo 1

如果我们跳过 OOP 方法的优点,a和之间的区别bb拥有自己的方法publicMethod,当a从其原型继承该方法时:

a.hasOwnProperty('publicMethod'); // false
b.hasOwnProperty('publicMethod'); // true
Run Code Online (Sandbox Code Playgroud)

请注意,该__proto__属性是非标准的,IE < 11 不支持。或者您可以使用 ES5 功能Object.getPrototypeOf(a)

另请注意 JavaScript 1的命名约定:

  • UPPER_CASE用于常量,而全局变量通常使用PascalCase,所以你MODULE应该是Module;
  • 构造函数也使用PascaleCase,所以你MODULE.constructor应该是Module.Constructor.