2013-06-06 19 views
6

Ho provato il seguente codice nella console di ChromePerché il valore della proprietà della lunghezza di una matrice cambia anche se impostato come di sola lettura in javascript?

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

Questo dimostra lunghezza 4 come previsto. Ora ho provato a installare proprietà length come scrivibile: true

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

Questo si traduce in 5 anche se la proprietà è impostata su scrivibili: falso. Come è successo? Non dovrebbe essere rimasto uguale a quando è impostato su sola lettura (scrivibile: falso)?

risposta

2

La struttura writable limita solo l'uso di operatori di assegnazione a quella immobiliare. Inoltre, il valore predefinito della proprietà writable è già false.

Ad esempio:

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

Si può vedere: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Se si desidera mantenere quel valore originale di a.length, penso che è meglio assegnarlo a un'altra variabile:

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

"Inoltre, il valore predefinito è già falso." - riferimento per favore –

+0

Collegamento dato già – kevinamadeus

+1

Suppongo che intendi che il valore predefinito di 'scrivibile' è falso per la proprietà length di un array. Anche la lunghezza nell'esempio è 4 e rimane 4 non 5. – Michiel

5

Object.defineProperty(a, "length", {writable: false}); influisce solo sul modo in cui il valore viene assegnato direttamente alla proprietà .length.

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

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

a.length = 0; 

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

Dipende anche da ciò che effettivamente restituisce proprietà length. Vedere il seguente esempio

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 

Fare una proprietà read-only significa che non è possibile assegnare il valore ad essa. Allo stesso tempo non cambia ciò che la proprietà restituisce quando viene letto. Dipende dalla definizione interna di quella proprietà.

Problemi correlati