JavaScript"类"

cdm*_*kay 8 javascript performance class

使用这种模式的JavaScript"类"有什么缺点吗?

var FooClass = function()
{
  var private = "a private variable";
  this.public = "a public variable";

  var privatefn = function() { ... };
  this.publicfn = function() { ... };
};

var foo = new FooClass();
foo.public = "bar";
foo.publicfn();
Run Code Online (Sandbox Code Playgroud)

oll*_*iej 14

你在你的例子中所做的不是人们在JS中想到的"类"模式 - 通常人们正在考虑Java/C#/ C++ /等更加"正常"的类模型,它们可以伪造成库.

相反,你的例子实际上是相当正常和良好的JS设计,但为了完整性,我将讨论你将在私人和公共"成员"之间看到的行为差异

var private = "a private variable";
this.public = "a public variable";
Run Code Online (Sandbox Code Playgroud)

访问private从内您的任何功能会比访问快了很多public,因为位置private可确定合理的也只是与JS引擎的静态查找.尝试访问public需要查找,大多数现代JS引擎执行一定程度的查找缓存,但它仍然比简单的范围var访问更昂贵.

var privatefn = function() { ... };
this.publicfn = function() { ... };
Run Code Online (Sandbox Code Playgroud)

与上述变量访问一样,相同的查找规则适用于这些函数,唯一真正的区别(在您的示例中)是,如果您的函数被调用,比如privatefn()vs this.publicfn(),privatefn将始终获取全局对象this.但如果有人这样做的话

f = foo.publicfn;
f();
Run Code Online (Sandbox Code Playgroud)

然后调用f将具有全局对象,this 它将能够修改private变量.

然而,执行公共函数的更常规方式(解决了修改私有成员问题的分离公共函数)是将公共函数放在原型上,例如.

Foo.prototype.publicfn = function() { ... }
Run Code Online (Sandbox Code Playgroud)

这迫使公共函数不修改私人信息 - 有时候这不是一个选项,但这是一个好习惯,因为它也会略微减少内存使用,采取:

function Foo1() {
    this.f = function(){ return "foo" };
}
Run Code Online (Sandbox Code Playgroud)

VS

function Foo2() {
}
Foo2.prototype.f = function(){ return "foo" };
Run Code Online (Sandbox Code Playgroud)

Foo1你有每个实例的函数对象的副本Foo1(不是所有的emory,只是对象,例如.new Foo1().f !== new Foo2().f),而在Foo2那里只有一个函数对象.