Javascript方法定义不一致

时间:2013-03-23 00:23:07

标签: javascript

我有一个包含多种方法的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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

嗯,简短的回答是在构造函数中分配了this.functionName = function()的项是按需创建的,而使用prototype创建的项更像是静态函数,因为它们存在于实例之外“函数”是基于程序执行而构建的,与实例化时相反。不一致是有意的或是初级编程的产物(可能是早期的)。

编辑:

顺便说一下,还有更多的东西,但细节一直在继续,有一件事只是浮现在脑海中,它还允许你在“类”里面有“私人”功能,如果你让它我称之为。您还可以通过以下方式定义原型对象:

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

答案 2 :(得分:1)

区别在于您何时要将公共函数添加到对象。

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

MenuObject.prototype.functionName = function()方法允许您在早先声明对象之后向对象添加其他函数。有点像为不同情况添加插件扩充对象。

答案 3 :(得分:1)

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

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

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