假设我有一个Foo
对象
如何通过添加bar()
方法扩展此对象,并确保Foo
的未来实例具有此方法?
答案 0 :(得分:65)
你需要将它添加到Foo的原型中:
function Foo(){}
Foo.prototype.bar = function(){}
var x = new Foo()
x.bar()
答案 1 :(得分:52)
这完全取决于您创建Foo
的方式,以及您打算如何使用.bar()
。
首先,您是否为对象使用构造函数?
var myFoo = new Foo();
如果有,那么您可以使用Foo
扩展prototype
函数的.bar
属性,如下所示:
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
),并创建.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
,this
,当您调用myObj.bar();
这样的函数时,将始终引用myObj
(public_interface
在我的例子中Foo
)。
这种格式的缺点是,如果要创建数百万个这样的对象,那么也会有数百万个.bar
的副本,这些副本会占用内存。
您也可以在构造函数内部执行此操作,在构造函数内部设置this.bar = function () {};
- 再次,上行将是对构造函数中的私有变量的闭包访问,而下行将增加内存需求。
所以第一个问题是:
您是否希望您的方法能够访问读取/修改“私有”数据,而这些数据无法通过对象本身(通过this
或myObj.X
)进行访问?
第二个问题是: 你是否制作了足够多的这些物品,以便记忆成为一个大问题,如果你给他们各自的个人功能,而不是让他们分享?
例如,如果你在高端3D游戏中为每个三角形和每个纹理赋予了自己的.draw
功能,这可能是过度的,并且它可能会影响这种精密系统中的帧速率...... / p>
但是,如果您希望每页创建5个滚动条,并且您希望每个滚动条能够设置其位置并跟踪它是否被拖动,而不让其他所有应用程序都有权读取/设置那些相同的东西,然后真的没有理由害怕5个额外的功能会杀死你的应用程序,假设它可能已经是10000行(或更多)。
答案 2 :(得分:11)
有许多方法可以在JavaScript中创建这样的可重用对象。 Mozilla在这里有一个很好的介绍:
以下内容适用于您的示例:
function Foo(){
this.bar = function (){
alert("Hello World!");
}
}
myFoo = new Foo();
myFoo.bar(); // Hello World
答案 3 :(得分:6)
你可以让bar成为一种功能,使它成为一种方法。
Foo.bar = function(passvariable){ };
作为一个属性,它只会被赋予一个字符串,数据类型或布尔值
Foo.bar = "a place";