使用JavaScript新构造函数和"这个"冲突

时间:2015-06-11 22:17:00

标签: javascript jquery

我通常使用这样的简单对象:

var Test = {

    value: '', // A value

    init: function(options) {

        // Set value
        Test.value = options.value;

    }

};

问题是当我想在页面上多次使用该对象时。它会覆盖自己。 E.g:

Test.init({ "value" : "a" });

// Test.value is now "a"

Test.init({ "value" : "b" });

// Test.value is now "b"

这就是我在JavaScript中转向新构造函数的原因,因此我可以将构造函数的内容分开。我不熟悉JavaScript构造函数,不管这是否是正确的方法,我不确定。

我现在已将其设置为像这样运行:

var first = new Test();
first.init({ "value" : "a" });

// first.value is now "a"

var second = new Test();
second.init({ "value" : "b" });

// second.value is now "a"

我现在的问题是在构造函数中使用this.value

这是我的意思的一个例子。您会看到我在this.value功能中设置init()。但是,当您使用它的$.each()函数创建JQuery循环时,JQuery会覆盖this,因此我无法访问this.value变量或this.format()函数。

function Test() {

    this.value = '';

}

Test.prototype = {

    // Loader
    init: function(options) {

        // Set value
        this.value = options.value;

        // This outputs fine
        console.log(this.value);

        // I'll now create a loop using the JQuery "each" function
        $('li').each(function() {

            // This fails because "this" has now been overwritten by JQuery inside this function
            this.format($(this).attr('data-id'), this.value);

        });

    },

    // Format output
    format: function(id, value) {

        console.log(id + ' : ' + value);

    }

};

var first = new Test();
first.init({ "value" : "a" });

var second = new Test();
second.init({ "value" : "b" });

以下是运行时发生错误的示例:

https://jsfiddle.net/8m46u73k/2/

所以有两个问题:

  1. 我是以正确的方式来做这件事吗?
  2. 如何在不使用this的情况下访问函数和变量?

2 个答案:

答案 0 :(得分:0)

您需要使用this

要在回调函数中使用this,请使用bind()强制始终使用正确的function() { this.whatever; }.bind(this); 调用函数:

int EditDistance(char s[1..m], char t[1..n])
   // For all i and j, d[i,j] will hold the Levenshtein distance between
   // the first i characters of s and the first j characters of t.
   // Note that d has (m+1)  x(n+1) values.
   let d be a 2-d array of int with dimensions [0..m, 0..n]

   for i in [0..m]
     d[i, 0] ← i // the distance of any first string to an empty second string
   for j in [0..n]
     d[0, j] ← j // the distance of any second string to an empty first string

   for j in [1..n]
     for i in [1..m]
       if s[i] = t[j] then  
         d[i, j] ← d[i-1, j-1]       // no operation required
       else
         d[i, j] ← minimum of
                    (
                      d[i-1, j] + 1,  // a deletion
                      d[i, j-1] + 1,  // an insertion
                      d[i-1, j-1] + 1 // a substitution
                    )

   return d[m,n]

答案 1 :(得分:-1)

function Test(value) {
  this.value = value;
}
var test = new Test();

以上不是一个班级。它是一个对象文字,它更像是一个类的实例。

这是一个班级:

function Car(value) {
  this.value = value;
}
Car.prototype.honkHorn = function () {
  conosle.log("HONK: " + this.value);
};

var car = new Car("I am a car!");
car.honkHorn(); // writes "HONK: I am a car!" to the console.

这是一个包含原型方法的类,因此每次创建新实例时都不会重复这些方法。

{{1}}