Javascript方法定义不一致

Javascript method definition inconsistency

本文关键字:不一致 定义 方法 Javascript      更新时间:2023-09-26

我有一个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...
} 

一些函数像这样定义。functionName = function(),其他如MenuObject.prototype。functionName = function()

我只是想知道为什么不是所有属于MenuObject定义为MenuObject.prototype. functionname = function()的函数?

如果您不使用私有实例变量,使用原型定义方法通常更有效,因为它们是由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

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

编辑:

顺便说一下,它甚至比这更多,但细节还在继续,我想到了一件事,它还允许你在"类"中拥有"私有"函数,如果你愿意的话。你也可以这样定义原型对象:

SomeFunction.prototype = {
     SomeFn1:function(){},
     SomeFn2:function(){},
     SomeFn3:function(){} // etc etc
};

在构造函数中定义方法。Method = fun..)可以通过闭包使用"私有"数据。此外,每次调用构造函数时都会创建构造函数中的方法。如果在调用构造函数时不使用'new', 'this'通常会附加到全局窗口对象,因此会导致非常令人困惑和误解的bug。

在构造函数(MenuObj.prototype.)之外定义方法。Method = fun..)可以在以后的代码中随时重写,而在构造函数内部定义总是优先的,并且不能被原型修改所重写。编辑原型会影响原型链,并可能导致非常令人困惑和误解的bug。

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

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

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

MenuObject.prototype.functionName = function()方法允许您在早先声明对象之后向对象添加额外的函数。所以有点像添加插件或者在不同的情况下增加对象