2016-10-10 138 views
-1

我需要檢查,如果多個文本域的值等於該對象的屬性name動態訪問功能對象屬性

function make_test(name, job, ID) { 
    test = {}; 
    test.name = name; 
    test.job = job; 
    test.ID = ID; 
    return test; 
} 
    new make_test("Paul", "manager", 1); //doesn't work 
    new make_test("John", "employee", 2); //doesn't work 
    new make_test("Jan", "employee", 2); //works 

這應該只是一個比賽,如果value等於名稱如果textarea的索引等於人的ID。舉例來說,如果我在textarea1鍵入「保羅」,它應該輸出保羅的工作:但它不應該將它輸出在textarea2只應輸出具有一個ID = 2

問題的人的工作:我的代碼僅適用於最後一個人聲明(在這個例子中是Jan)。這就像其他人甚至不存在於對象中,除了最後一個。我怎樣才能解決這個問題 ?

我相信答案很明顯,但我無法弄清楚我做錯了什麼。

演示在這裏:https://jsfiddle.net/Lau1989/hxcpstty/

感謝您的幫助

+1

測試是全球性的...所以只有最後一個考驗將是當前.. 。你需要刷上javascript –

+0

這不是一個構造函數,它是一個返回Object的函數。對象文字已經是「新」了。調用'new'來從構造函數創建一個對象。 – PHPglue

+0

但是,由於您正在進行測試,所以它沒有任何意義,但是您不會存儲它正在返回的東西。 – epascarello

回答

2

您需要聲明test是本地變量,以便你的函數的所有調用不是指完全相同的全局變量。當你不聲明你的變量時,它變成了一個隱含的全局變量,它可能導致各種各樣的問題。如果您在strict mode中運行您的代碼,解釋器也會將此標記爲您的錯誤(這通常很有幫助)。

您還需要將函數的返回結果賦值給變量,以便您可以使用該變量引用新創建的對象。

function make_test(name, job, ID) { 
    var test = {}; 
// ^^^ 
    test.name = name; 
    test.job = job; 
    test.ID = ID; 
    return test; 
} 
var o1 = make_test("Paul", "manager", 1); 
var o2 = make_test("John", "employee", 2); 
var o3 = make_test("Jan", "employee", 2); 

console.log(o1.name); // "Paul" 
console.log(o3.job); // "employee" 

也因爲你不使用的系統創建的對象不需要new在函數的前面 - 你是剛剛創建自己的對象並將其返回。它仍然可以與new一起使用,但是由於您沒有使用系統將使用new創建的對象,所以它很浪費。

如果你希望它是在您使用new並可以繼承原型的實際構造函數,那麼這樣做:

function Make_test(name, job, ID) { 
    this.name = name; 
    this.job = job; 
    this.ID = ID; 
} 

var o1 = new Make_test("Paul", "manager", 1); 
var o2 = new Make_test("John", "employee", 2); 
var o3 = new Make_test("Jan", "employee", 2); 

注意,我這裏用一個大寫的構造函數的名字,因爲它是一種常見的約定爲構造函數使用初始帽名稱,爲常規函數使用初始小寫名稱。


你也可以只取出聲明完全:

function make_test(name, job, ID) { 
    return {name: name, job: job, ID: ID}; 
} 

或者使用ES6語法:

function make_test(name, job, ID) { 
    return {name, job, ID}; 
} 
+0

但是OP使用它的方式,修復這個bug並不會讓代碼的其餘部分運行。 – epascarello

+0

謝謝,我雖然在某個時候需要處理全局變量,但我仍然不知道如何在另一個函數中訪問var test = {}屬性。簡單地在make_test之外聲明它並不能解決問題 – Lau

+0

@Lau - 你的問題中的代碼並沒有真正顯示你想要用make_test()創建的對象。在我的例子中,我將它們分配給另一個變量,並且可以通過引用您指定新對象的變量來使用新創建的對象。 – jfriend00