假设我有一个Foo
对象
我如何通过添加一个bar()
方法来扩展这个对象,并确保未来的实例Foo
拥有这个方法?
假设我有一个Foo
对象
我如何通过添加一个bar()
方法来扩展这个对象,并确保未来的实例Foo
拥有这个方法?
您需要将其添加到 Foo 的原型中:
function Foo(){}
Foo.prototype.bar = function(){}
var x = new Foo()
x.bar()
这一切都取决于您如何创建Foo
以及您打算如何使用.bar()
.
首先,您是否为您的对象使用构造函数?
var myFoo = new Foo();
如果是这样,那么您可以使用 扩展Foo
函数的prototype
属性.bar
,如下所示:
function Foo () { /*...*/ }
Foo.prototype.bar = function () { /*...*/ };
var myFoo = new Foo();
myFoo.bar();
在这种方式下,每个实例Foo
现在可以访问SAME的实例.bar
。
即:.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
),并将其.bar
作为该对象的属性创建:
function giveMeObj () {
var private = 42,
privateBar = function () { console.log(private); },
public_interface = {
bar : privateBar
};
return public_interface;
}
var myObj = giveMeObj();
myObj.bar(); // 42
以这种方式,您有一个创建新对象的函数。
这些对象中的每一个都有一个.bar
为它们创建的函数。
每个.bar
函数都可以通过所谓的闭包访问返回其特定对象的函数中的“私有”变量。
每个人.bar
仍然可以访问this
as this
,当您调用函数时, likemyObj.bar();
将始终引用myObj
( public_interface
,在我的示例中Foo
)。
这种格式的缺点是,如果你要创建数百万个这样的对象,那也是数百万个 的副本.bar
,这会占用内存。
您也可以在构造函数内部执行此操作,在构造函数this.bar = function () {};
内部进行设置——同样,优点是可以关闭对构造函数中私有变量的访问,缺点是内存需求增加。
所以第一个问题是:
您是否希望您的方法能够读取/修改无法通过对象本身(通过this
或myObj.X
)访问的“私有”数据?
第二个问题是:如果你给它们每个人自己的个人功能,而不是让它们分享,你是否制作了足够多的这些对象,以至于记忆将成为一个大问题?
例如,如果您.draw
在高端 3D 游戏中为每个三角形和每个纹理赋予其自己的功能,那可能有点矫枉过正,而且很可能会影响如此精细系统中的帧率……
但是,如果您希望为每页创建 5 个滚动条,并且您希望每个滚动条都能够设置其位置并跟踪它是否被拖动,而不让其他所有应用程序都有权读取/设置这些相同的内容,那么真的没有理由害怕 5 个额外的函数会杀死你的应用程序,假设它可能已经有 10,000 行(或更多)。
有很多方法可以在 JavaScript 中创建像这样的可重用对象。Mozilla 在这里有一个很好的介绍:
以下将适用于您的示例:
function Foo(){
this.bar = function (){
alert("Hello World!");
}
}
myFoo = new Foo();
myFoo.bar(); // Hello World
您可以使 bar 成为一个函数,使其成为一个方法。
Foo.bar = function(passvariable){ };
作为一个属性,它只会被分配一个字符串、数据类型或布尔值
Foo.bar = "a place";