在构造函数的方法中替换'this.variable'

时间:2011-09-11 10:31:55

标签: javascript

我一直在尝试编写一个构造函数,它会使一个对象充满复杂的方法。这些方法处理父母的变量以及调用兄弟方法。这是我能给你的最好的例子。这是一个即兴的基于Web的控制台。

function ConsoleCont(type,instace){
    this.type=type;
    this.input=$('conI');//input type=text
    this.output=$('conO');//textarea
    this.commandRecall=new Array;
    //event listeners for enter-key to this.send(), etc.
    this.send=function(){
        if(this.input.value){this.commandRecall.push(this.input.value);}
        this.consoleConcat("> "+this.input.value);
        /*Code to send via AJAX*/
        this.input.value="";
    }
    this.consoleConcat=function(command){
        /*code to push to Textarea*/
    }
    this.receive=function(latestLine){
        this.consoleConcat(latestLine)
    }
}

现在我发现自己需要输入“这个”。我在对象中引用的一切;无论如何都要假设'这个'。 (比如C ++的using namespace或其他东西)或者我的方法可能有点低效?我不是在寻找任何Jquery解决方案,我自己预先定义了$('');,因为你抓住了它。

3 个答案:

答案 0 :(得分:3)

就我所见,您可以在代码中丢弃一些this

function ConsoleCont(type,instace) {
//                             ^did you mean instance?
    // both input/output are assigned to a fixed value, so they seem
    // not specific to an instance, hence can be ('static'-like) variables
    var input  = $('conI'), 
        output = $('conO'); 

    // these are really local (instance) properties
    this.type  = type;
    this.commandRecall = [];

    // the event listener(s) can be added to the constructors prototype
    if (!ConsoleCont.prototype.send){
     var proto = ConsoleCont.prototype;
     proto.send = function(){
        if(input.value){
           this.commandRecall.push(this.input.value);
        }
        consoleConcat("> "+this.input.value);
        /*Code to send via AJAX*/
        this.input.value = "";
     };
    }

    // if not used as public methods, these methods can be 
    // assigned and used within the current scope ('private')
    function consoleConcat(command){
        /*code to push to Textarea*/
    }

    function receive(latestLine){
        consoleConcat(latestLine)
    }
}

因此,检查代码中值或函数属性的必要性可以减少this的数量。减少所有this全部输入的唯一其他机制可能确实使用with,但这有一些陷阱,如Douglas Crockford explained here

答案 1 :(得分:1)

也许with这个词可以帮到你:

function ConsoleCont(type,instace)
{
  with(this)
  {
    type=type;
    input = $('conI');
    /* ... */
  }
}

以下是一个示例:http://jsfiddle.net/34trZ/2/

答案 2 :(得分:0)

要明白这一点:当强调此对象的构造函数中的对象属性时,要避免键入this不可能。当然,局部变量和函数不符合this.的限定条件。