2015-10-01 16 views
5

Wiem, że to może być duplikat, ale znalazłem wiele pytań, które były podobne do moich, ale ich odpowiedź nie odpowiedziała na moje. Na przykład ta strona https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty nie zawierała odpowiedzi na moje pytanie, o ile wiem.Dodaj obiekt do obiektu JS

To jest to, co mam:

var User = function() { 
 
    this.name = ''; 
 
} 
 

 
User.prototype.password = ''; 
 
// or 
 
Object.defineProperty(User.prototype, 'password', {enumerable: true, configurable: true, writable: true}); 
 

 
console.log(new User()); // User {name: ""}

To oczywiście dodaje hasło do prototypu obiektu, ale chciałbym dodać hasło jako członek po konstruktor został zdefiniowany . Czy istnieje sposób, aby to osiągnąć?

var User = function() { 
 
    this.name = ''; 
 
} 
 

 
User.prototype.password = ''; 
 

 
console.log(new User()); // User {name: "", password: ""}

+4

Nie umieszczaj danych członka na prototypie. Jeśli zrobisz wszystkie wystąpienia tego typu będą miały tę samą wartość dla tego elementu. – bhspencer

+0

Pytanie brzmi, jak wprowadzić właściwości prototypu do dziennika konsoli? Nawiasem mówiąc, powinno to być 'defineProperty (User.prototype, ...'. W każdym razie, nie rozumiem, co próbujesz osiągnąć poprzez umieszczenie 'password' na prototypie.Nie musi to być instancja właściwość jak 'name', więc może być różna dla każdego użytkownika? –

+0

Myślę, że to jest problem: chce, aby jego funkcja' User' miała więcej właściwości instancji * po * on już zdefiniował konstruktora. Próbuję rozwiązać w mojej odpowiedzi – nils

Odpowiedz

3

Jeśli chcesz utworzyć nowy obiekt z operatorem new, to może okazać się trudne, jeśli nie można modyfikować konstruktora więcej. O ile mi wiadomo, konstruktor jest jedynym miejscem, w którym można zdefiniować zmienne instancji, jeśli używasz operatora new.

Jeśli było tworzyć obiekty z Object.create, you can pass in further properties in the second parameter, który jest podobny do Object.defineProperty:

var User = function() { 
    this.name = ''; 
} 

User.prototype.xyz = ''; // Add whatever you need to your prototype 

var o = Object.create(User.prototype, { 
    'password': {enumerable: true, configurable: true, writable: true, value: ''} 
}); 
User.call(o); 

Jeśli musisz to zrobić przed stworzeniem obiektu, zawsze można owinąć oryginalny konstruktor w innej funkcji:

var User = function() { 
    this.name = ''; 
} 

User.prototype.xyz = ''; // Add whatever you need to your prototype 

var originalUser = User; 

var User = function() { 
    this.password = ''; 
    originalUser.call(this); 
} 

User.prototype = originalUser.prototype; 

var o = new User(); 

Osobiście uważam, że wersja Object.create jest bardziej przejrzysta i mniej podatna na błędy (szczególnie, jeśli masz wiele właściwości, które chcesz dodać w różnych momentach).

+0

To jest bardzo zdezorientowany. Definiujesz konstruktora , ale potem nie używaj go do stworzenia obiektu, zamiast tego użyj 'Object.create', a następnie wywołaj konstruktora jako zwykłą funkcję działającą jak rodzaj inicjalizatora? Następnie w drugim przykładzie tworzymy jedną wersję Użytkownik, a następnie nadpisanie go innym, a następnie skopiowanie g prototypu z jednego do drugiego - w ogóle go nie rozumiem. –

+0

Założyłem kilka rzeczy: 1. * Prawdopodobnie chciałby użyć konstruktora również do innych operacji. * 2. * Dodaje, że ma więcej właściwości instancji dodanych do obiektu utworzonego za pomocą 'new', niż zdefiniował w jego konstruktor. Nie chce ich w prototypie, w przeciwnym razie jego wartość zostanie przesłonięta dla wszystkich instancji * - Więc chciałem trzymać się jego kodu jak najbliżej. Czy to ma więcej sensu? Jestem z pewnością otwarty na propozycje ulepszeń. – nils

+0

Podczas gdy oba te rozwiązania działają, nie zdecydowałem jeszcze, które z nich będę używać. Ale i tak dzięki! – phippu