У меня есть функция Person
конструктора как и с помощью метода SayHelloСвойство на прототипе переопределяет свойство фактического объекта?
var Person = function(firstName,lastName) {
this.lastName = lastName;
this.sayHello = function() {
return "Hi there " + firstName;
}
};
Тогда я определяю другую версию метода SayHello на прототипе Person
:
Object.defineProperties(Person.prototype,{
sayHello: {
value: function() {
return 'Hi there';
},
enumerable: true
}
});
Теперь, если я создаю Person экземпляр и вызов sayHello на нем - я замечаю, что он использует версию sayHello, которая определена на прототипе.
var JoeBlow = new Person('Joe','Blow');
> JoeBlow.sayHello()
< "Hi there" // I was expecting "Hi there Joe"
Это для меня сбивает с толку.
Почему объект JoeBlow не использует свой собственный Реализация sayHello вместо того, чтобы искать sayHello на своем прототипе объекта?
Я не уверен, но вы также пытаетесь получить return 'firstname' вместо' this.firstname'. возможно, вы пропустили 'this.firstname = firstname', и тогда вы сможете получить возврат. Потому что он возвращает 'udefined' с ответом Quentin –
@nAz -' firstname' - это переменная, определенная здесь - '(firstName, lastName)' - и все еще находится в области выражения функции, определенного внутри функции конструктора. Я проверил код в своем ответе, и он возвращает «Привет, Джо». – Quentin
@Quentin yeap, вы правы, возможно, я пропустил что-то, поэтому я его протестировал и был удивлен. Спасибо –