我正在编写一个小型手机游戏库,但我不确定声明实例化函数对象的成员函数的最佳做法。
例如,我可能会创建一个具有一个属性和打印它的方法的简单对象:
function Foo(id){
this.id = id;
this.print = function(){
console.log(this.id);
};
};
但是,不需要访问函数“私有(private)”成员的函数根本不需要在函数中声明。我同样可以写:
function print(){
console.log(this.id);
};
function Foo(id){
this.id = id;
this.print = print;
};
当通过 Foo 的实例调用该函数时,该实例成为 this
的上下文,因此两种情况下的输出都是相同的。
我不完全确定内存是如何用 JS 分配的,我找不到任何我能理解的关于这个特定的东西,但在我看来,第一个例子是 Foo 的所有成员,包括打印函数,每次实例化时都会复制 - 但对于第二个函数,它只是获得一个指向一个预先声明的函数的指针,这将节省在创建更多 Foo 实例时必须分配的更多内存。
我是对的吗?如果我是对的,这样做对内存/性能有好处吗?
最佳答案
你是对的,在第一种情况下,使用 Foo
构造函数创建的每个对象都将有一个打印机函数的实例。避免这种情况的一个简单方法是将它添加到 Foo
的 prototype
中:
function Foo(id){
this.id = id;
};
Foo.prototype.print = function () {
console.log(this.id);
};
或者:
function Foo(id){
this.id = id;
};
Foo.prototype = {
print: function () {
console.log(this.id);
}
};
推荐阅读:
- Mozilla Developer Network: Inheritance and the prototype chain
- Douglas Crockford:JavaScript - 好的部分
关于javascript - 成员函数的 JS 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19614371/