Javascript向对象添加方法


74

假设我有一个Foo对象

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

Answers:


80

您需要将其添加到Foo的原型中:

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

62

这一切取决于您的创建方式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仍然可以访问thisas this,当您调用函数时,likemyObj.bar();始终将引用myObjpublic_interface在我的示例中Foo)。

这种格式的缺点是,如果您要创建数百万个这样的对象,那么也有数百万个的副本.bar,这些副本将吞噬内存。

您也可以在构造函数内部执行此操作,在构造函数this.bar = function () {};内部进行设置-再次,上行将是对构造函数中私有变量的闭包访问,而下行将是增加的内存需求。

因此,第一个问题是:
您是否希望您的方法有权读取/修改“私有”数据,而这些数据无法通过对象本身(通过thismyObj.X)访问?

第二个问题是:如果给每个对象赋予他们自己的个人功能,而不是让他们共享它们,那么您是否充分利用了这些对象,以便使内存成为一个大问题?

例如,如果您.draw在高端3D游戏中为每个三角形和每个纹理赋予其自己的功能,那可能是过大了,并且可能会影响如此精致的系统中的帧速率...

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


12

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

以下将在您的示例中起作用:

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

myFoo = new Foo();
myFoo.bar(); // Hello World​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

10

您可以将bar设为使其成为方法的函数。

Foo.bar = function(passvariable){  };

作为属性,它将仅被分配一个字符串,数据类型或布尔值

Foo.bar = "a place";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.