2014-01-20 168 views
0

我試圖創建以下吸氣的javascript吸氣:私有變量

function Field(val){ 
    this.value = {}; 
} 

Field.prototype = { 
    get value(){ 
     return this._value; 
    }, 
    set value(val){ 
     this._value = val; 
    } 
}; 

但我能做到的,是爲field.value

一個getter我想要實現這樣的事情:

field.value.foo['20'] = 'some_value'; // ==> Setter 
field.value.foo['20']; // 'some_value' ==> Getter 

但我沒能做到這一點,利用上面的代碼..有人可以幫助..

+0

初始化容器爲'this.value = {foo:{}};'? –

+0

你所有的索引是整數嗎?你可以讓你的對象[數組](http://stackoverflow.com/questions/11886578/creating-array-like-objects-in-javascript)。 – Emissary

+0

@使者這不會達到預期的目標:使這些值保密。 –

回答

0

你實際上可以在ES5中解決這個問題。我在這裏記錄本,爲其他用戶,以幫助從它的增益..

function Foo() { 
    this.__value__ = {}; 
    this.__value__['20'] = 'some_value'; 
}; 

Foo.prototype.__defineGetter__('foo', function() { 
    return this.__value__; 
}); 

function Field() { 
    this.__value__ = new Foo(); 
}; 

Field.prototype.__defineGetter__('value', function() { 
    return this.__value__; 
}); 

現在,爲了測試這個..

var field = new Field(); 
var value = field.value.foo['20']; 
console.log(value); 

我已經更新了的jsfiddle here

+0

真棒@ r8k ..非常感謝.. – user3216499

+1

不要使用這個!您忘記了[MDN發出的重大警告](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineGetter):*非標準 此功能不可用,標準並且不在標準軌道上。不要在面向Web的生產站點上使用它:它不適用於每個用戶。實現之間也可能存在很大的不兼容性,並且行爲在未來可能會發生變化。 –

1

你想要的是一個通用的getter/setter,能夠改變你的value對象的任何屬性。

不幸的是,對於當前版本的ECMAScript來說,這是不可能的,您將不得不等待proxies,這應該與ECMAScript 6一起提供(並且可以在最後的壁虎中找到)。

請參閱ES6 wiki for direct proxies

與此同時,您的真正問題可能是JavaScript的當前狀態的解決方案。

+0

您能否談談「解決當前JavaScript狀態」的問題? – user3216499

+0

@ user3216499「真正的問題」。我的意思是:你所要求的東西在大多數瀏覽器中是不可能的,所以你需要從**開始爲什麼**你是否想要這樣做並尋找另一種設計。 –