0

我有一个带有多种方法的 javascript 对象。但是我注意到定义方法的方式有些不一致。

这是对象:

function MenuObject(containerId, skin) {

    this.id = containerId;
    this.something = something2;
    .
    .
    .
    this.anotherThing = anotherThing2;      

    this.setSkin = function(skin) { //We have a function here

        //body...
    {


}


MenuObject.prototype.getTopLevelPolygon = function() //Another function.
{
   var p = this.something3;

   //Method body goes here...
} 

一些函数的定义类似于this.functionName = function(),其他的类似于MenuObject.prototype.functionName = function()

我只是想知道为什么不属于 MenuObject 的所有功能都定义为 MenuObject.prototype.functionName = function() ?

4

4 回答 4

2

如果您不使用私有实例变量,则使用原型定义方法通常更有效,因为它们由 javascript 内部(通过原型)一举分配给新对象,而不是一次单独分配一个你自己的代码。

而且,良好的编码习惯会说,除非有特定原因,否则不应混合使用方法(并且此代码并未指出使用混合的任何特定原因)。

当您希望它们能够访问私有实例变量时,在构造函数中分配方法是有原因的:

function MenuObject(containerId, skin) {

    var myPrivateVariable = 0;

    this.setSkin = function(skin) {
        // method can access myPrivateVariable here, 
        //    but a method put on the prototype cannot access it
    }
}

您可以在此处阅读有关私有实例变量的更多信息:http: //javascript.crockford.com/private.html

于 2013-03-23T00:27:24.303 回答
1

好吧,简短的回答是,在构造函数中分配this.functionName = function()的项目是按需创建的,而使用创建的prototype项目更像是静态函数,因为它们存在于“函数”的实例之外并且是在程序执行时构建的,而不是到实例化时。这些不一致要么是故意的,要么是初级编程的产物(可能是更早的)。

编辑:

顺便说一句,它还有更多的东西,但细节还在继续,我想到了一件事,它还允许你在“类”中拥有“私有”功能,如果你让我称之为那。你也可以这样定义原型对象:

SomeFunction.prototype = {
     SomeFn1:function(){},
     SomeFn2:function(){},
     SomeFn3:function(){} // etc etc
};
于 2013-03-23T00:26:59.520 回答
1

不同之处在于您何时要向对象添加公共函数。

this.functionName = function()方法要求您在声明对象时定义所有对象函数function MenuObject(containerId, skin) { ... };

MenuObject.prototype.functionName = function()方法允许您在之前声明对象后向对象添加附加功能。有点像为不同的情况添加插件扩充对象。

于 2013-03-23T00:27:13.680 回答
1

在构造函数中定义方法(this.method = fun..)可以通过使用闭包来使用“私有”数据。此外,每次调用构造函数时都会创建构造函数中的方法。如果在调用构造函数时不使用“new”,“this”通常会附加到全局窗口对象,因此可能会导致非常混乱和误解的错误。

在构造函数之外定义方法 (MenuObj.prototype.method = fun..) 可以在以后的代码中随时覆盖,而在构造函数内部定义总是优先,并且不能被原型修改覆盖。编辑原型会影响原型链,并可能导致非常混乱和被误解的错误。

我建议阅读 Douglas Crockford 的书籍或访问他的网站http://www.crockford.com/并查看有关 JavaScript 的视频和文章。

于 2013-03-23T00:33:51.727 回答