2013-06-06 10 views
6

Próbowałem następujący kod w Chrome konsoliDlaczego wartość właściwości długości tablicy zmienia się, nawet jeśli ustawiono ją jako tylko do odczytu w javascript?

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

To pokazuje długość jak 4, jak oczekiwano. Teraz próbowałem ustawienie właściwości length jako zapisu dla: false

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

Skutkuje to 5, mimo że właściwość jest ustawiona na zapisywalny: false. Jak to się stało? Czy nie powinien pozostać taki sam, jak ustawiony na tylko do odczytu (zapis: false)?

Odpowiedz

2

Obiekt writable ogranicza jedynie użycie operatorów przypisania do tej właściwości samego. Ponadto, domyślna właściwość writable jest już false.

Na przykład:

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

widać: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Jeśli chcesz zachować tę oryginalną wartość a.length, myślę, że lepiej przypisać go do innej zmiennej:

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

"Domyślnie jest już fałszywe." - proszę podać –

+0

Link podany już – kevinamadeus

+1

Zakładam, że masz na myśli domyślną wartość 'writable', która jest fałszywa dla właściwości length tablicy. Długość w twoim przykładzie wynosi 4 i pozostaje 4, a nie 5. – Michiel

5

Object.defineProperty(a, "length", {writable: false}); wpływają tylko na sposób przypisania wartości bezpośrednio do właściwości .length.

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

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

a.length = 0; 

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

To zależy również od tego, co faktycznie zwraca właściwość: length. Zobacz poniższy przykład

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 

Making właściwość read-only oznacza, że ​​nie może przypisać wartość do niego. Jednocześnie nie zmienia to, co właściwość zwraca po przeczytaniu. To zależy od wewnętrznej definicji tej właściwości.

Powiązane problemy