1

我正在编写一个小型手机游戏库,我不确定声明实例化函数对象的成员函数的最佳实践。

例如,我可能会创建一个具有一个属性的简单对象,以及一个打印它的方法:

function Foo(id){
    this.id = id;
    this.print = function(){ 
        console.log(this.id); 
    };
};

但是,不需要访问函数的“私有”成员的函数根本不需要在函数中声明。我同样可以写:

function print(){
    console.log(this.id);
};

function Foo(id){
    this.id = id;
    this.print = print;
};

当通过 Foo 的实例调用该函数时,该实例成为 的上下文this,因此在任何一种情况下输出都是相同的。

我不完全确定 JS 是如何分配内存的,我找不到任何我能理解的关于这个特定的东西,但在我看来,对于第一个例子,Foo 的所有成员,包括 print 函数,都是每次实例化时都会重复 - 但第二次,它只是获得一个指向一个预先声明的函数的指针,这将节省更多的内存,因为创建了更多的 Foo 实例。

我是否正确,如果正确,这样做是否有任何内存/性能优势?

4

1 回答 1

3

没错,在第一种情况下,使用Foo构造函数创建的每个对象都将具有打印机函数的实例。避免这种情况的一种简单方法是将其添加到prototypeof 中Foo

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);
    }
};

推荐阅读:

于 2013-10-27T03:44:03.473 回答