2015-06-11 13 views
-2

我通常使用簡單對象是這樣的:使用JavaScript的新構造和「這個」衝突

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構造函數完全陌生,不管這是否是正確的方法,我都不確定。

我現在有它建立這樣運行:使用this.value構造內部時

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" 

我現在的問題是。

這裏是我的意思的一個例子。你會看到我在init()函數中設置了this.value。但是,當使用它的$.each()函數創建JQuery循環時,this被JQuery覆蓋,因此我無法訪問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的情況下訪問函數和變量?
+0

你的第一個例子不是一個類。 – SLaks

+0

我已經更新了我的問題,謝謝@SLaks –

+0

也許這太簡單瞭解決方案,但也許可以保存對頂部對象「this」的引用?即var self = this;這樣,您可以在需要訪問對象屬性的任何位置引用「自我」。 (即你的jQuery函數) –

回答

0

您需要使用this

要在回調函數使用this,使用bind()迫使功能始終與正確this叫:

function() { this.whatever; }.bind(this); 
+0

謝謝@SLaks。它似乎沒有工作。我誤解了你的意思嗎?我試過[this](https:// jsfiddle。net/8m46u73k/3 /)和[this](https://jsfiddle.net/8m46u73k/4/)。 –

+0

@BenSinclair:使用正確的'this'調用原型方法(並且沒有'this'來綁定它們)。你只需要這個回調。你需要學習Javascript如何工作。 – SLaks

-1
var Test = { 
    value: '', // A value 
    init: function(options) { 
    // Set value 
    Test.value = options.value; 
    } 
}; 

上面的是不是一類。它是一個對象字面值,它更類似於一個類的實例。

這是一類:

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. 
+0

我已經更新了我的問題到正確的措辭謝謝。但是,這不是一個真正的答案。 –

+0

你的更新後它不是一個答案:P原來你說的問題是「當我在構造函數中使用它」,並且你沒有構造函數,所以'this'指的是外部作用域,而不是對象。 – Chev

+0

嗯,我還想再添加一個答案,但我會以倒計時爲線索,這是浪費時間。 – Chev