Javascript JS成员函数的最佳实践

Javascript JS成员函数的最佳实践,javascript,optimization,functional-programming,Javascript,Optimization,Functional Programming,我正在编写一个小型手机游戏库,我不确定声明实例化函数对象的成员函数的最佳实践 例如,我可以创建一个具有一个属性的简单对象,以及打印该对象的方法: function Foo(id){ this.id = id; this.print = function(){ console.log(this.id); }; }; 但是,不需要访问函数的“私有”成员的函数根本不需要在函数中声明。我也可以这样写: function print(){ consol

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

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

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实例时节省必须分配的更多内存


我说得对吗?如果我说得对,那么这样做对内存/性能有什么好处吗?

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

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

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


建议如下:

  • Douglas Crockford:JavaScript——好的部分

如果您不需要访问私有变量,最好的做法是将成员函数添加到原型中。希望JS编译器能够告诉您,第一个函数没有引用任何闭包变量,因此它可以对所有实例重用相同的函数。干杯!然而,我还有另一个问题-除了一种名称空间,在“未绑定”(我想你可以说-它们不是全局的,因为它们在IIFE中)函数上使用原型还有什么好处?如果您想让其他不相关的对象实现相同的方法,这种方式似乎更简洁。如果您有两种不相关的类型,
function Foo(id){This.id=id;}
function Bar(id){This.id=id;}
,并且它们以相同的方式打印,然后,您可以向这两种类型的原型添加相同的打印函数:
Foo.prototype.print=Bar.prototype.print=function(){console.log(this.id);}。方法的好处是,它们可以通过
this
变量访问调用它们的实例的属性。值得一提的是,制作
打印
方法并不是绝对必要的(但很方便)。如果您有一个使用
this
的“未绑定”打印函数,例如
function print2(){console.log(this.id);}
,那么您可以在
Foo
Bar
对象上调用它,而不将其添加到原型中:
var Foo=new Foo(42);打印2.呼叫(foo)
var条=新条(123);打印2.呼叫(bar)。细节:但是‘unbound’(不知道正确的术语,我们将使用它!)函数也可以访问它们用‘this’调用的实例……除了语义之外,行为上似乎没有区别,所以我认为这一定是为了干净的代码和/或性能。”(不知道正确的术语,我们将使用它!)函数也可以访问使用“this”调用它们的实例。“-是的,这就是
print2.call(foo);
所做的,它将
this
变量设置为
foo
。如果编写此命令:
print2()
然后
这个
将引用全局对象。我几乎忘了提到最简单的技术:如果将对象作为参数传递,则可以完全避免使用
这个
变量:
函数print3(obj){console.log(obj.id);}
,然后:
print3(foo);
print3(bar);
function Foo(id){
    this.id = id;
};

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