2015-10-01 2 views
5

Я знаю, что это может быть дубликат, но я нашел много вопросов, которые были похожи на мои, но их ответ не ответил на мои вопросы. Например, на этой странице https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty не было ответа на мой вопрос, насколько я знаю.Добавить объект в объект JS

Это то, что у меня есть:

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: ""}

Это, конечно, добавляет пароль к прототипу объекта, но я хотел бы добавить пароль в качестве члена после того, как конструктор был определен , Есть ли способ достичь этого?

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

 
User.prototype.password = ''; 
 

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

+4

Не помещайте данные элемента в прототип. Если все экземпляры этого типа будут иметь одинаковое значение для этого элемента. – bhspencer

+0

Итак, ваш вопрос заключается в том, как создать свойства прототипа в журнале консоли? Кстати, это должно быть 'defineProperty (User.prototype, ...'. Во всяком случае, я не понимаю, чего вы пытаетесь выполнить, поставив «пароль» на прототипе. Не нужно ли быть экземпляром свойство, подобное 'name', поэтому оно может быть различным для каждого пользователя? –

+0

Я думаю, что это проблема: он хочет, чтобы его функция' User' имела больше свойств экземпляра * после того, как он уже определил конструктор. Это то, что я пытаясь решить в моем ответе – nils

ответ

3

Если вы хотите создать новый объект с оператором new, это может оказаться трудным, если вы не можете изменить конструктор больше. Насколько я знаю, конструктор - это единственное место, где могут быть определены переменные экземпляра, если вы используете оператор new.

Если вы должны были создавать объекты с Object.create, you can pass in further properties in the second parameter, который похож на 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); 

Если вам нужно сделать это до создания объекта, вы всегда можете обернуть свой оригинальный конструктор в другой функции:

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(); 

Я лично считаю, версия Object.create четче и менее подвержены ошибкам (особенно если у вас есть несколько свойств, которые вы хотите добавить в разное время).

+0

Это очень смущает. Вы определяете конструктор , но затем не используйте его для создания объекта, вместо этого используя 'Object.create', затем вызывайте конструктор как регулярную функцию, чтобы действовать как своего рода инициализатор? Тогда во втором примере вы создаете одну версию Пользователь, затем переписывая его другим, затем скопируйте g прототип от одного к другому - я не понимаю его вообще. –

+0

Я предположил несколько вещей: 1. * Возможно, он захочет использовать конструктор для других операций. * 2. * Он хочет добавить, добавлено больше свойств экземпляра к объекту, созданному с помощью 'new', чем он определил в его конструктора. Он не хочет их в прототипе, иначе его значение будет переопределено для всех экземпляров * - Поэтому я хотел как можно ближе придерживаться его кода. Это имеет смысл? Я, безусловно, открыт для предложений по улучшению. – nils

+0

Хотя оба этих решения работают, я еще не решил, на что я собираюсь использовать. Но все равно спасибо! – phippu

Смежные вопросы