2015-09-01 2 views
1

Я новичок в JavaScript, поэтому, если я не понимаю понятия, пожалуйста, не стесняйтесь, дайте мне знать.Как я могу переопределить свойство в этой ситуации

У меня есть следующий класс:

var Human = function() {}; 
Object.defineProperty(Human.prototype, 'name', { 
    get: function() { return this._name; }, 
    set: function (value) { this._name = value; }, 
    configurable: true, 
    enumerable: true 
}); 

Я тогда определить следующий дочерний объект:

var Man = function() {}; 
Man.prototype = new Human(); //Am I inherting Human's prototype (and properties) here? 
Man.prototype.name = 'Matt'; //If so, I should be setting Man's name property (overriding the value inherited from Human) 

Однако console.log(Man.name) распечатывает "".

Почему это и как я могу правильно переопределить Human?

PS:

Я также попытался

Man.name = 'Matt'; 

вместо

Man.prototype.Name = 'Matt'; 

Но я получил такое же поведение.

Ps2:

Следует также отметить, что, если я исполню console.log(Man.prototype._name) я получить ожидаемый выход "Matt"

+0

'Man.name' - это имя_функции_, которое не имеет ничего общего с этим свойством' name'. Если вы выполнили 'var Man = function someName() {};', 'Man.name' будет' 'someName" '. В любом случае, каково ваше ожидаемое поведение? – Xufox

ответ

2

Поскольку вы устанавливаете прототип свойства, необходимо создать экземпляр нового объекта из этого конструктора, а затем прототип будет использоваться для создания нового экземпляра объекта:

var Man = function() {}; 
Man.prototype = new Human(); 
Man.prototype.name = 'Matt'; 

var man = new Man(); // <--- this is new man 
console.log(man.name); 

Однако, вероятно, вы не хотите, чтобы все Man Insta ncies, чтобы иметь одно и то же имя - что происходит, когда вы помещаете вещи в prototype, это становится общим для всех ситуаций. Это имеет смысл:

var Man = function() {}; 
Man.prototype = new Human(); 

var man = new Man(); 
man.name = 'Matt'; 
console.log(man.name); 

Здесь вы только установить собственный свойство объекта man.

+0

Это точное поведение, которое я хотел достичь. Определение свойства в суперклассе и перезапись его в дочернем элементе. Спасибо! –

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