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那里只有一个函数对象.
| 归档时间: |
|
| 查看次数: |
1525 次 |
| 最近记录: |