2016-08-04 17 views
-1

Wie setze ich Object.prototype.somefunction auf `readonly`?

var obj = {}; 
 
console.log(obj.constructor === Object); // true 
 
console.log(typeof obj.constructor); // function 
 

 
obj['foo'] = 'bar'; 
 
obj['constructor'] = 'String'; 
 

 
console.log(obj.constructor === Object); // false 
 
console.log(typeof obj.constructor); // string

Ich mag einen Fall, in diesem Beispiel nennen: Im obj Objekt, Ich habe einen neuen Eigenschaftsnamen constructor mit Wert String hinzugefügt. Und die Art des Wertes ist string.

So: 'string' !== 'function'.

Da ich es als das zweite überschreibe, kann ich es nicht wie eine Funktion als erstes verwenden.

Das bedeutet auch: einige js Entwickler (fast) wollen keine Eigenschaft, die den Namen constructor in einem Objekt zu deklarieren. Wenn ich das versuche, wird der Standardwert constructor überschrieben.

Same auf einen anderen Fall:

var array = []; 
 
console.log(typeof array.forEach); // function 
 

 
array['forEach'] = 'String'; 
 
console.log(typeof array.forEach); // string

Warum akzeptiert keine js mehrere Schlüssel mit demselben Namen, aber Differenzwerttypen?

Was ich will, erreichen:

var action = { 
    isDone: false, 
    isDone: function (flag) { 
     this.isDone = flag 
    } 
}; 

action.isDone(progressing is done); 
if (action.isDone) { 
    // done... 
} 

// 'boolean' !== 'function' 

Meine Fragen:

1 /. Wie definiere ich eine neue Eigenschaft für ein Objekt mit demselben Schlüssel? (nicht mit anderen Themen duplizieren, weil same key but differnce value types);

2 /. Ist es der beste Weg zu verhindern, eine Objekteigenschaft zu überschreiben? (Oder readonly als Titel)

var obj = {}; 
Object.defineProperty(obj, 'constructor', { 
    get: function() { 
     return function() { 
      // default constructor here... 
     } 
    }, 
    set: function (newValue) { 
     // do nothing here... 
    } 
}) 

Antwort

0

Wie neue Eigenschaft auf ein Objekt mit demselben Schlüssel definieren? (Dupliziere nicht mit anderen Themen, da die gleichen Schlüssel aber unterschiedliche Werttypen sind);

Sie können nicht

Ist es der beste Weg, um zu verhindern eine Objekt-Eigenschaft außer Kraft zu setzen?

Sicher, aber Sie verwenden es immer noch wahrscheinlich falsch. Und welcher Code Sie auch schreiben, ist wahrscheinlich schlechtes JavaScript.

Unabhängig von der Sprache, aus der Sie kommen, schlage ich vor, nicht versuchen, andere Idiome in JavaScript zu implementieren. JavaScript ist eine eigene Sache. Lerne, wie man idiomatisches JavaScript schreibt.

+0

Ich komme aus C# :( –

1

var obj = { 
 
\t }; 
 

 
// being explicit 
 
Object.defineProperty(obj, 'testFunction', { 
 
    writable: false, 
 
    value: function(){ 
 
\t console.log("Print read only Function"); 
 
\t return; 
 
    } 
 
}); 
 

 
console.log(obj.testFunction.toString()); 
 

 

 
obj.testFunction(); 
 

 
obj.testFunction= function(){ 
 
\t console.log("Override Function"); \t 
 
} 
 

 
console.log(obj.testFunction.toString()); 
 
obj.testFunction();

Verwandte Themen