2013-06-06 1 views
6

私は予想通りこれは4と長さを示しているクロムのコンソールなぜ配列のlengthプロパティの値がjavascriptで読み込み専用に設定されていても変更されますか?

var a = new Array(1,2,3,4); 
a.length 

に次のコードを試してみました。 は、今私は、書き込み可能なようlengthプロパティを設定してみました:偽:プロパティが書き込み可能に設定されているにもかかわらず

Object.defineProperty(a, "length", {writable: false}); 
a[4] = 5; 
a.length 

偽これは5になります。どうしてこうなりました?読み取り専用(書き込み可能:false)に設定されているため、同じままにしてはいけませんか?

答えて

2

writableプロパティのみ代入演算子そのプロパティ自体からの使用を制限します。また、デフォルトのwritableプロパティはすでにfalseです。例えば

var a = new Array(1,2,3,4); 
a.length; # 4 
a.length++; # a.length is still 4 

あなたが見ることができます:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

あなたがa.lengthの元の値を保持したい場合は、私はあなたがより良い別の変数に代入したいと思う:

x = [1,2,3,4]; # x.length is 4 
y = x.length; # y is 4 
x = [1,2,3,4,5] # x.length is now 5, but y is still 4 
+0

"また、デフォルトはすでにfalseです。" - 参照してください –

+0

既に与えられたリンク – kevinamadeus

+1

私はあなたが配列の長さのプロパティのための '書き込み可能'のデフォルト値がfalseであることを意味すると思います。また、あなたの例の長さは4であり、4は5ではありません。 – Michiel

5

Object.defineProperty(a, "length", {writable: false});は、.lengthプロパティに値を直接割り当てる方法にのみ影響します。

var a = [1,2,3,4]; 

Object.defineProperty(a, "length", {writable: false}); 

a.length = 0; 

console.log(a.length); // still be 4 
0

また、実際に何が返されるかによって異なります。length次の例read-onlyは、あなたがそれに値を割り当てることはできません意味プロパティを作る

var MyObject = function(){ 
    var _count = 0; 
    this.increment = function(){ 
     _count++; 
    } 
    this.getCount = function(){ 
     return _count; 
    } 
}; 

var object = new MyObject(); 

Object.defineProperty(object, "count", { // new property `count` calls `getCount` 
    writeable:false, 
    get: function(){ 
     return this.getCount(); 
    } 
}); 


alert(object.count); // 0 
object.count = 90; 
object.increment(); 
alert(object.count); // 1 
object.count = 100; 
object.increment(); 
alert(object.count); //2 

を参照してください。同時に、それが読み取られたときにプロパティが返すものは変更されません。それはそのプロパティの内部定義に依存します。

関連する問題