JavaScript类 [英] JavaScript Classes
问题描述
我了解基本的JavaScript伪类:
I understand basic JavaScript pseudo-classes:
function Foo(bar) {
this._bar = bar;
}
Foo.prototype.getBar = function() {
return this._bar;
};
var foo = new Foo('bar');
alert(foo.getBar()); // 'bar'
alert(foo._bar); // 'bar'
我也了解模块模式,可以模拟封装:
I also understand the module pattern, which can emulate encapsulation:
var Foo = (function() {
var _bar;
return {
getBar: function() {
return _bar;
},
setBar: function(bar) {
_bar = bar;
}
};
})();
Foo.setBar('bar');
alert(Foo.getBar()); // 'bar'
alert(Foo._bar); // undefined
但是,这两种模式都有非OOP类属性。前者不提供封装。后者不提供实例化。这两种模式都可以被修改为支持伪继承。
But there are un-OOP-like properties to both of these patterns. The former does not provide encapsulation. The latter does not provide instantiation. Both patterns can be modified to support pseudo-inheritance.
我想知道的是如果有任何模式允许:
What I'd like to know is if there is any pattern that allows:
- 继承
- 封装(支持私有属性/方法)
- 实例化可以有多个类的实例,每个都有自己的状态。
推荐答案
关于这个:
var Foo = (function() {
// "private" variables
var _bar;
// constructor
function Foo() {};
// add the methods to the prototype so that all of the
// Foo instances can access the private static
Foo.prototype.getBar = function() {
return _bar;
};
Foo.prototype.setBar = function(bar) {
_bar = bar;
};
return Foo;
})();
现在我们有实例化,封装和继承。
但是还有是一个问题。 private
变量是 static
,因为它在 Foo
的所有实例中共享C>。快速演示:
And now we have instantiation, encapsulation and inheritance.
But, there still is a problem. The private
variable is static
because it's shared across all instances of Foo
. Quick demo :
var a = new Foo();
var b = new Foo();
a.setBar('a');
b.setBar('b');
alert(a.getBar()); // alerts 'b' :(
更好的方法可能是使用私有变量的约定:any私有变量应该以下划线开头,这个约定是众所周知的,广泛使用,所以当另一个程序员使用或改变你的代码并看到一个以下划线开头的变量时,他会知道它是私有的,仅供内部使用,他赢得了'
这是使用这个约定的重写:
A better approach might be using conventions for the private variables : any private variable should start with an underscore. This convention is well known and widely used, so when another programmer uses or alters your code and sees a variable starting with underscore, he'll know that it's private, for internal use only and he won't modify it.
Here's the rewrite using this convention :
var Foo = (function() {
// constructor
function Foo() {
this._bar = "some value";
};
// add the methods to the prototype so that all of the
// Foo instances can access the private static
Foo.prototype.getBar = function() {
return this._bar;
};
Foo.prototype.setBar = function(bar) {
this._bar = bar;
};
return Foo;
})();
现在我们有实例化,继承,但是我们已经失去了对于约束的封装:
Now we have instantiation, inheritance, but we've lost our encapsulation in favor of conventions :
var a = new Foo();
var b = new Foo();
a.setBar('a');
b.setBar('b');
alert(a.getBar()); // alerts 'a' :)
alert(b.getBar()); // alerts 'b' :)
但私有变量可访问:
delete a._bar;
b._bar = null;
alert(a.getBar()); // alerts undefined :(
alert(b.getBar()); // alerts null :(
这篇关于JavaScript类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!