2013-04-22 4 views
0

Я пытаюсь создать простой объект Person, который является одним из свойств его прототипа, но это не представляется возможным, поскольку область изменений изменяется.Свойство прототипа Javascript, определяемое как объект

var Person = function() {}; 

Person.prototype.set = function(data) { 
    this.data = data; 
}; 

Person.prototype.update = { 
    name: function(name) { 
     this.data.name = name; 
    } 
}; 

var me = new Person(); 
me.set({name: 'Achilleas'}); 
me.update.name('John'); 

Вы также можете запустить его на этом jsFiddle

Это то, что я хочу, чтобы достичь возможно? Я знаю, что могу это сделать, используя apply для назначения области, но мне не очень нравится это решение.

Благодарим вас за то, что потратили время на мой первый вопрос на Stackoverflow.

ответ

1

Проблема, вызванная вашим вызовом, вызвана тем, что this ссылается на литерал объекта, который создан и назначен объекту update. Он не относится к человеку. Поэтому, ссылаясь на this.data.name, возникает ошибка, поскольку литерал объекта не имеет свойства данных.

Я бы порекомендовал только продлить прототип Person, чтобы включить метод обновления, который принимает свойство для обновления и значение. Также добавьте data как собственность человека.

var Person = function() { 
    this.data = {}; 
}; 

Person.prototype.set = function(data) { 
    this.data = data; 
}; 

Person.prototype.update = function(property, value){ 
    this.data[property] = value; 
}; 

var me = new Person(); 
me.set({name: 'Achilleas'}); 
me.update('name','John'); 

Рабочий примерhttp://jsfiddle.net/fj5uY/7/

+0

Да, я знаю об этом решении, а также. Но вопрос в том, можно ли работать me.update.name («John») без использования приложения или вызова. – Knorcedger

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