Javascript将方法添加到对象

Chi*_*hin 64 javascript

假设我有一个Foo对象

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

VeX*_*Xii 66

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

function Foo(){}
Foo.prototype.bar = function(){}
var x = new Foo()
x.bar()
Run Code Online (Sandbox Code Playgroud)


Nor*_*ard 56

这一切都取决于您的创作方式Foo以及您打算如何使用.bar().

首先,您是否为对象使用构造函数?

var myFoo = new Foo();
Run Code Online (Sandbox Code Playgroud)

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

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

var myFoo = new Foo();
myFoo.bar();
Run Code Online (Sandbox Code Playgroud)

以这种方式,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
Run Code Online (Sandbox Code Playgroud)

换句话说,您可以定义一个函数来返回任何对象(而不是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
Run Code Online (Sandbox Code Playgroud)

以这种方式,您有一个创建新对象的功能.
每个对象都有.bar为它们创建的功能.
每个.bar函数都可以通过所谓的闭包访问返回其特定对象的函数中的"私有"变量.
每个人.bar仍然可以访问this,因为this,当你调用函数myObj.bar();时总会引用myObj(public_interface在我的例子中Foo).

这种格式的缺点是,如果你要创造数百万这些对象,那也是数以百万计的副本.bar,这将会占用内存.

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

所以第一个问题是:
您是否希望您的方法能够访问读取/修改"私有"数据,这些数据无法通过对象本身(通过thismyObj.X)访问?

第二个问题是:你是否制造了足够的这些物品,以便记忆成为一个大问题,如果你给他们各自的个人功能,而不是让他们分享?

例如,如果你.draw在高端3D游戏中给出了每个三角形和每个纹理自己的功能,这可能是过度的,并且它可能会影响这种精致系统中的帧速率......

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


Oli*_*ran 12

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

以下内容适用于您的示例:

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

myFoo = new Foo();
myFoo.bar(); // Hello World?????????????????????????????????
Run Code Online (Sandbox Code Playgroud)


小智 8

你可以使bar成为一种功能,使其成为一种方法.

Foo.bar = function(passvariable){  };
Run Code Online (Sandbox Code Playgroud)

作为属性,它将被赋予字符串,数据类型或布尔值

Foo.bar = "a place";
Run Code Online (Sandbox Code Playgroud)