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
每个实例现在都可以访问.bar
的SAME实例。
.bar
将this
有完整的访问权限,但在构造函数中绝对不会访问 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();
将始终引用myObj
( public_interface
,在我的示例Foo
)。
这种格式的缺点是,如果要创build数百万个这样的对象,这也是数百万个.bar
的拷贝,它们将会进入内存。
你也可以在构造函数中做这个,设置this.bar = function () {};
在构造函数的内部 – 同样,在构造函数中,上行将是closures访问私有variables,而下行则会增加内存需求。
所以第一个问题是:
你期望你的方法有权读取/修改“私人”的数据,这是不能通过对象本身(通过this
或myObj.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";