2013-04-25 79 views
2

在PHP中,一個類可以實現了ArrayAccess接口,因此類可以等來實例化和訪問:Javascript中的對象可以像PHP中的ArrayAccess/ArrayObject一樣嗎?

class MyClass implements ArrayAccess { 
    protected $data = array(); 
    public function offsetGet($offset) { 
    return isset($this->data[$offset]) ? $data[$offset] : null; 
    } 
    public function offsetSet($offset, $value) { 
    $this->data[$offset] = $value; 
    } 
    public function __toString() 
    { 
    return print_r($this->data); 
    } 
} 

$a = new MyClass; 
$a['item'] = 10; 
$a['item2'] = 'adsf'; 
echo $a; 
// Outputs Array('item' => 10, 'item2' => 'adsf') 

有沒有這樣的Javascript什麼?我希望能夠在Javascript中創建一個迭代器類,但是可以使用括號表示來訪問項目,而不是使用get('item')/set('item2', 'asdf'),因此它可以像數組而不是對象那樣工作,但仍然具有來自我的所有函數構造器(下一個,上一個,是,復位等)

我問這是因爲AngularJS,使用angular.element()時,在Firebug的控制檯

+0

所以你想要一個「數組」,可以通過鍵(像對象文字),仍然有數組方法?接下來是什麼,先行,是,重置等? – Ian 2013-04-25 01:32:26

+0

是的。 next,prev,is,reset是類迭代器函數,我已經添加了一些信息爲什麼我要求在這個問題的底部 – pocesar 2013-04-25 01:35:07

+0

所以,你已經有一個JavaScript類?如果是這樣,你可以展示它嗎? – Ian 2013-04-25 01:38:43

回答

1

答案是肯定的返回一個對象(?)像Object [div.id1],但不在任何旨在供公衆使用的應用程序中。

ECMAScript 5支持'get'和'set'聲明(在已知屬性上),並且在將來的修訂中將支持代理(可以偵聽對象的任何更改),但是如果您的應用程序要支持IE ,或者用戶沒有選擇下載開發者瀏覽器的任何設備,以及啓用dev-switches,你將不得不將許多用戶留在後面幾年(考慮智能手機的合同長度,而手機瀏覽器仍然不存在),或者在try-catch子句中實現舊版本和測試兼容性,否則使用這些功能可能會導致嚴重的異常,或者根本無法正常工作。

因此,是的,但無論如何,你必須以舊的方式去做。

+0

我明白了,AngularJS只在好的瀏覽器上才能做到這一點?我還沒有在IE中測試過它,但angular.element返回一個「數組對象」 – pocesar 2013-04-25 01:50:21

+1

@pocesar這是一個**非常長的故事。但是,DOM-mutators與JS代理不同,因爲jQuery的實體系統(用於模擬不支持瀏覽器的增變器)使用jQuery包裝角度DOM元素。有時候用jQuery嘗試一下:'var el = $(「#my-el」);' - 它實際上並不是一個DOM元素。 'el [0];'是元素。儘管如此,您應該進一步瞭解Angular的實現方式 - 它確實非常精良,並且是一些優秀的寵物項目,學習如何實現類似的東西。 – Norguard 2013-04-25 02:04:10

+0

不錯,我會閱讀關於即將到來的東西然後:) ES6看起來很有希望 – pocesar 2013-04-25 02:07:26

相關問題