Nicht erfasster TypeError: Kann keine schreibgeschützte Eigenschaft zuweisen

Lesezeit: 2 Minuten

Benutzer-Avatar
Larrydalmeida

Ich habe dieses wirklich einfache Beispiel aus dem großartigen Buch „Professional JavaScript for Web Developers“ von Nicholas Zakas ausprobiert, aber ich kann nicht herausfinden, was ich hier falsch mache. Muss etwas wirklich Einfaches sein, das ich verpasst habe, aber ich stecke fest.

Hier ist der Code:

'use strict';

var book = {};

Object.defineProperties(book, {
    originYear: {
        value: 2004,
        writable: false
    },

    _year: {
        value: 2004
    },

    edition: {
        value: 1
    },

    year : {
        get: function() {
            return this._year;
        },

        set: function(newValue) {
            if(newValue > this.originYear) {
                this._year = newValue;
                this.edition += newValue - this.originYear;
            }
        }
    }
});

console.log(book.edition);
book.year = 2006;
console.log(book.edition);

Der Fehler, den ich in der Chrome-Konsole erhalte, ist:

Nicht erfasster TypeError: Kann der schreibgeschützten Eigenschaft „_year“ von #main.js:31 nicht zuweisen Object.defineProperties.year.setmain.js:39 (anonyme Funktion)

Kann mir bitte jemand erklären, wo ich falsch liege?

Hier ist der Geige

Benutzer-Avatar
Löwe

Wenn Sie verwenden Object.definePropertiesstandardmäßig writable ist eingestellt auf falseAlso _year und edition sind eigentlich schreibgeschützt Eigenschaften.

Setzen Sie sie explizit auf writable: true:

_year: {
    value: 2004,
    writable: true
},

edition: {
    value: 1,
    writable: true
},

Kasse MDN für diese Methode.

writable
true genau dann, wenn der der Eigenschaft zugeordnete Wert mit einem Zuweisungsoperator geändert werden kann.
Standardmäßig auf false.

  • Danke für die Antwort, die mich zu meiner Lösung geführt hat. Ich hatte eine Variable: var thisObject = {name: 'a name', id: 1}; und irgendwann in dem Code, den ich einstellte thisObject = 1; (Ich denke, es war alter Code oder ich habe ihn einfach nicht richtig geschrieben … und als ich versuchte, ihn zu verwenden oder festzulegen thisObject.name danach kam diese fehlermeldung. Entfernen der Linie, wo ich setze thisObject zu einer Ganzzahl mein Problem behoben. Hoffe, das hilft jemandem.

    – Termato

    27. Oktober 2015 um 14:54 Uhr


Benutzer-Avatar
Ramkumar

Wenn manchmal eine Verbindung! wird nicht funktionieren. Erstellen Sie also ein temporäres Objekt und nehmen Sie alle Werte aus dem beschreibbaren Objekt, ändern Sie dann den Wert und weisen Sie ihn dem beschreibbaren Objekt zu. es sollte perfekt.

var globalObject = {
    name:"a",
    age:20
}
function() {
    let localObject = {
    name:'a',
    age:21
    }
    this.globalObject = localObject;
}

Ich habe versucht, mich zu ändern year zu einem anderen Begriff, und es funktionierte.

public_methods : {
    get: function() {
        return this._year;
    },

    set: function(newValue) {
        if(newValue > this.originYear) {
            this._year = newValue;
            this.edition += newValue - this.originYear;
        }
    }
}

  • Versuchte dies. Aber es gibt immer noch einen Fehler, wenn es auf diese Zuweisung zur Eigenschaft _year stößt. Hat es die Aufgabe ausgeführt, ohne einen Fehler für Sie auszulösen? Vielen Dank

    – Larrydalmeida

    17. Dezember 2014 um 7:11 Uhr

  • Leos Antwort ist richtig. Herabgesetzt, weil die Antwort vorschlägt, einen Variablennamen zufällig zu ändern, um den Fehler zu beheben, der Fehler nachlässig beheben und wahrscheinlich mehr Fehler verursachen würde.

    – Larrydalmeida

    29. November 2015 um 18:19 Uhr

1098980cookie-checkNicht erfasster TypeError: Kann keine schreibgeschützte Eigenschaft zuweisen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy