2016-11-23 21 views
0

我想:如何對象的JavaScript數組的實例化過程中引用屬性

  1. 實例化一個JavaScript對象數組,其中對象的屬性指的是物體本身的其他屬性,然後
  2. 使用該數組用於配置一組按鈕的點擊事件。

問題(請參見片段上方):

  1. mymessage和myvalue的參數是未定義的時anotherfunction()被調用
  2. 被點擊myclass*類的一個按鈕,當x [I] .myaction( );在按鈕被點擊的時間是不確定的,因爲,我求2

var x = [{ 
 
    mymessage: "this is message1", 
 
    myclass: "myclass1", 
 
    myvalue: 10, 
 
    myaction: function() { 
 
    var res = anotherfunction(mymessage, myvalue); 
 
    //do something with res 
 
    } 
 
}, { 
 
    mymessage: "this is message2", 
 
    myclass: "myclass2", 
 
    myvalue: 20, 
 
    myaction: function() { 
 
    res = anotherfunction(mymessage, myvalue); 
 
    //do something else with res 
 
    } 
 
}]; 
 

 
function anotherfunction(m, v) { 
 
    alert(m); 
 
    return v; 
 
} 
 
for (var i = 0, len = x.length; i < len; i++) { 
 
    $('.' + x[i].myclass).click(function() { 
 
    alert(i); 
 
    x[i].myaction(); 
 
    }); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="myclass1">Click me1</div> 
 
<div class="myclass2">Click me2</div>

+1

按照這一問題的修改版本。您可以在for循環內的IIFE的幫助下,在閉包下取出'i'。 – Redu

+0

我明白你在說什麼,但不幸的是,我沒有如此實際的JavaScript在上述情況下有效地使用這種模式:-(請問你能給我一個例子嗎? –

+1

編輯後它是一個重複的[ - 簡單的實踐例子](http://stackoverflow.com/q/750486/1529630) – Oriol

回答

1

對於你其實應該使用this的對象像

myaction: function() { 
    anotherfunction(this.mymessage, this.myvalue); 
    } 

然而,你可重用性的目的應該用適當的上下文來調用它在事件監聽器的回調中如下:

var x = { 
 
    mymessage: "this is a message", 
 
    myclass: "myclass", 
 
    myvalue: 10, 
 
    myaction: function() { 
 
    anotherfunction(this.mymessage, this.myvalue); 
 
    } 
 
}; 
 
function anotherfunction(m, v) { 
 
    alert(m); 
 
} 
 
$('.'+x.myclass).click(function(e){x.myaction()})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="myclass">Click me</div>

所以按照這一問題的修改後的版本,我相信這是一個很好的例子來證明對象的數組中的this的可重用性。您可以安全地執行以下操作;

var x = [{ 
 
    mymessage: "this is message1", 
 
    myclass: "myclass1", 
 
    myvalue: 10, 
 
    myaction: function() { 
 
    var res = anotherfunction(this.mymessage, this.myvalue); 
 
    //do something with res 
 
    } 
 
}, { 
 
    mymessage: "this is message2", 
 
    myclass: "myclass2", 
 
    myvalue: 20, 
 
    myaction: function() { 
 
    res = anotherfunction(this.mymessage, this.myvalue); 
 
    //do something else with res 
 
    } 
 
}]; 
 

 
function anotherfunction(m, v) { 
 
    alert(m); 
 
    return v; 
 
} 
 
for (var i = 0, len = x.length; i < len; i++) { 
 
    (function(j){ 
 
    $('.' + x[j].myclass).click(function(e) { 
 
            alert(j); 
 
            x[j].myaction(); 
 
           }); 
 
    })(i); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="myclass1">Click me1</div> 
 
<div class="myclass2">Click me2</div>

+1

它給出'undefined'作爲結果 –

+0

@Roberto Vanoli關於'this'。我忽略了。現在可以了。 – Redu

+0

感謝您的建議,我編輯了我的問題(但ps注意我的問題已從'實例化對象'更改爲'實例化數組')。 –

1

只要將其更改爲以下

var x = { 
 
    mymessage: "this is a message", 
 
    myclass: "myclass", 
 
    myvalue: 10, 
 
    myaction: function() { 
 
    anotherfunction(x.mymessage, x.myvalue); 
 
    } 
 
}; 
 

 
function anotherfunction(m, v) { 
 
    alert(m); 
 
} 
 

 
$('.' + x.myclass).click(x.myaction);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="myclass"> 
 
    hi 
 
</div>

希望它可以幫助

+0

請參閱我對@Oriol回覆的評論 –

2

只需使用x.mymessagex.myvalue

var x = { 
 
    mymessage: "this is a message", 
 
    myclass: "myclass", 
 
    myvalue: 10, 
 
    myaction: function() { 
 
    anotherfunction(x.mymessage, x.myvalue); 
 
    } 
 
}; 
 
function anotherfunction(m, v) { 
 
    alert(m); 
 
} 
 
$('.'+x.myclass).click(x.myaction)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="myclass">Click me</div>

+0

按照您的解決方案(實際上回答原始問題),我意識到我的問題被過分簡化了,我修改了它 –

相關問題