Object.defineProperties - czym różnią się te przykłady?

Object.defineProperties - czym różnią się te przykłady?
PK
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:27
0

Mój przykład, dostaję undefined.

Kopiuj
const vehicle1 = {};
Object.defineProperties(vehicle1, {
    property1: {
        speed: 200
    }
}); console.log(vehicle1.property1);

Teraz przykład lekko przerobiony z dokumentacji, daje wynik 50:

Kopiuj
const object1 = {};
Object.defineProperties(object1, {
    property1: {
        value: 50
    }
}); console.log(object1.property1);

Dlaczego w moim jest undefined? Przecież to jest 1 do 1, tylko inna nazwa zmiennej, co swoją drogą po zmianie nie ma różnicy i dalej mam undefined. Nie ogarniam, o co chodzi?

edytowany 1x, ostatnio: PanKrakers
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około godziny
  • Postów:8423
1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties
Bo musi być value. Przez value ustalasz wartość właściwości, a nie jej nazwę.

The value associated with the property. Can be any valid JavaScript value (number, object, function, etc). Defaults to undefined.

tylko inna nazwa zmiennej,

Nazwa właściwości, a nie zmiennej.

Ale jak się domyślam chcesz ustawić właściwość speed. To raczej powinieneś coś takiego zrobić:

Kopiuj
const object1 = {};
Object.defineProperties(object1, {
    speed: {
        value: 50
    }
}); 
console.log(object1.speed);

Przy czym przy normalnym korzystaniu nie ma potrzeby używania defineProperties. Tzn. jest to pewna zaawansowana opcja, która czasem (i to raczej dość rzadko) może się przydać, ale na codzień można się bez niej obyć. Bo na codzień zrobiłbyś tak:

Kopiuj
object1.speed = 50;

ale defineProperties i defineProperty mają jeszcze inne opcje jak ustawienie getterów/setterów (co również można zrobić inaczej: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get ) czy ustawienie, czy właściwość ma byc "enumerable".

The enumerable property attribute defines whether the property is picked by Object.assign() or spread operator. For non-Symbols properties it also defines whether it shows up in a for...in loop and Object.keys() or not.

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


edytowany 4x, ostatnio: LukeJL

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.