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与一些私有和静态属性的比较 - 两种技术的工作方式相同,据我所知...
粗略地说,主要优点原型继承(你的"构造"的方法)是更容易做到的子类和的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)
如果我们跳过 OOP 方法的优点,a和之间的区别b是b拥有自己的方法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.| 归档时间: |
|
| 查看次数: |
3298 次 |
| 最近记录: |