Javascript将方法添加到对象

假设我有一个Foo对象

如何通过添加bar()方法来扩展此对象,并确保将来的Foo实例具有此方法?

你需要把它添加到Foo的原型中:

 function Foo(){} Foo.prototype.bar = function(){} var x = new Foo() x.bar() 

这一切都取决于你如何创buildFoo ,以及你打算如何使用.bar()

首先,你是否在为你的对象使用构造函数?

 var myFoo = new Foo(); 

如果是这样的话,那么你可以用.bar来扩展Foo函数的prototype属性,如下所示:

 function Foo () { /*...*/ } Foo.prototype.bar = function () { /*...*/ }; var myFoo = new Foo(); myFoo.bar(); 

以这种方式, Foo每个实例现在都可以访问.barSAME实例。
.barthis有完整的访问权限,但在构造函数中绝对不会访问 variables

 function Foo () { var secret = 38; this.name = "Bob"; } Foo.prototype.bar = function () { console.log(secret); }; Foo.prototype.otherFunc = function () { console.log(this.name); }; var myFoo = new Foo(); myFoo.otherFunc(); // "Bob"; myFoo.bar(); // error -- `secret` is undefined... // ...or a value of `secret` in a higher/global scope 

换句话说,你可以定义一个函数来返回任何对象(不是this ),作为该对象的一个​​属性创build.bar

 function giveMeObj () { var private = 42, privateBar = function () { console.log(private); }, public_interface = { bar : privateBar }; return public_interface; } var myObj = giveMeObj(); myObj.bar(); // 42 

以这种方式,你有一个创build新对象的function。
每个对象都有一个为他们创build的.bar函数。
每个.bar函数都可以通过所谓的闭包访问返回它们特定对象的函数中的“私有”variables。
每个.bar仍然可以访问this ,因为this ,当你调用像myObj.bar();函数myObj.bar(); 将始终引用myObjpublic_interface ,在我的示例Foo )。

这种格式的缺点是,如果要创build数百万个这样的对象,这也是数百万个.bar的拷贝,它们将会进入内存。

你也可以在构造函数中做这个,设置this.bar = function () {}; 在构造函数的内部 – 同样,在构造函数中,上行将是closures访问私有variables,而下行则会增加内存需求。

所以第一个问题是:
你期望你的方法有权读取/修改“私人”的数据,这是不能通过对象本身(通过thismyObj.X )访问?

第二个问题是:你是否做了足够的这些东西,这样记忆就会成为一个大问题,如果你给他们各自的个人function,而不是给他们一个分享?

例如,如果在高端3D游戏中给每个三angular形和每个纹理赋予自己的.draw函数,这可能是矫枉过正的,而且这可能会影响这样一个精巧系统的帧率。

但是,如果您希望每页创build5个滚动条,并且希望每个滚动条都能够设置其位置并跟踪是否被拖动,而不让其他所有应用程序都可以读取/设置相同的内容,那么真的没有理由担心5个额外的函数会杀死你的应用程序,假设它可能已经是10,000行(或更多)。

有很多方法可以在JavaScript中创build像这样的可重用对象。 Mozilla在这里有一个很好的介绍:

以下将在你的例子中工作:

 function Foo(){ this.bar = function (){ alert("Hello World!"); } } myFoo = new Foo(); myFoo.bar(); // Hello World​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

你可以使酒吧成为一种方法的function。

 Foo.bar = function(passvariable){ }; 

作为一个属性,它只会被分配一个string,数据types或布尔值

 Foo.bar = "a place";