2016-07-01 2 views
0

Я ищу анализ этого кода, и у меня проблемы. Моя проблема начинается с этой строки. Customer.prototype = new Person();. Теперь, насколько я знаю. Мы можем добавить некоторые методы к нашим переменным, как это было с Person.prototype.getName. Отлично, теперь Person имеет proto, указывающий на функцию, которая возвращает имя. Итак, что это значит, когда мы делаем Customer.prototype = new Person();. Означает ли это, что взять все методы и утверждения в Person и поместить их внутри переменной Customer?Использование .prototype для добавления метода к переменной

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

Person.prototype.getName = function() { 
    return this.name; 
}; 


var john = new Person("John"); 

//Try the getter 
alert(john.getName()); 


Person.prototype.sayMyName = function() { 
    alert('Hello, my name is ' + this.getName()); 
}; 

john.sayMyName(); 

var Customer = function(name) { 
    this.name = name; 
}; 


Customer.prototype = new Person();  


var myCustomer = new Customer('Dream Inc.'); 
myCustomer.sayMyName(); 


Customer.prototype.setAmountDue = function(amountDue) { 
    this.amountDue = amountDue; 
}; 
Customer.prototype.getAmountDue = function() { 
    return this.amountDue; 
}; 


myCustomer.setAmountDue(2000); 
alert(myCustomer.getAmountDue()); 
+0

в ООП TEMS это означает, что Клиент наследует от лица –

+0

не кладите слишком много думал об этом, [это неправильно так или иначе] (http://stackoverflow.com/a/17393153/1048572?Benefits-of -using-Object.create-for-inheritance) – Bergi

ответ

1

Каждый объект имеет прототип, который также является объектом.

Когда вы

Customer.prototype = new Person(); 

... установить объект прототип Customer «s. Методы и свойства не копируются в объект Customer, но когда вы ссылаетесь на свойство/метод на Customer, отслеживается цепочка прототипов, чтобы найти это свойство/метод.

В случае myCustomer.sayMyName, двигатель JavaScript первым смотрит в myCustomer «s, находящихся в собственности недвижимости, то в его прототип, который является Person объект, а затем, наконец, в прототипе Person, который является объектом, который имеет этот метод:

Person.prototype.sayMyName = function() { 
    alert('Hello, my name is ' + this.getName()); 
}; 
+0

Что именно вы имеете в виду, они не получают скопированные, но ссылочные свойства? Означает ли это, что клиент может использовать все, что имеет в нем лицо, но его изменение не похоже на фактическое значение VALUE клиента? –

+0

Что вы имеете в виду? Единственное, что меняется в Клиенте, это его прототип (его свойство '__proto__'). Все остальное регулируется движком JavaScript, который реализует наследование цепи прототипов. И да, свойства, выставленные Лицом, доступны Клиенту, если у Клиента нет собственной реализации для них. – trincot

+0

Я вижу. Таким образом, свойства, выставленные Лицом, доступны Клиенту, но противоположность, безусловно, не соответствует действительности? –

1

Поступая Customer.prototype = new Person() мы, по сути делаем класс наследование, как на другом языке. Так, скажем, у нас было:

var p = new Person(); 
Customer.prototype = p; 
var c = new Customer(); 

Прототип (__proto__) из c является p и прототипом p является Person.prototype.

Наивный способ сделать наследование будет Customer.prototype = Person.prototype, который заставит все экземпляры Клиента использовать те же методы, что и Person. Но, если бы мы сделали Customer.prototype.newMethod = ..., было бы также изменить прототип Person.prototype (как они и тот же объект.

Чтобы различать прототип клиента и Person прототипа, мы используем new Person() вместо этого как промежуточное звено в цепи, которая до сих пор имеет связь с прототипом человека, но это отдельный объект

. Примечание: обычно это больше обычного, чтобы сделать Customer.prototype = Object.create(Person) с последующим Customer.prototype.constructor = Customer; потому что делать new Person() означает, что конструктор Person называется (который, как правило, не хотел если вы фактически не делаете настоящий объект).

+0

Пожалуйста, дайте мне знать, если верно следующее: скажите, что у человека есть некоторые свойства. Возможно, он может вернуть ваше полное имя. Теперь мы делаем var p = new Person() ;. Таким образом, P наследует все свойства от человека. Теперь мы говорим Customer.prototype = p ;. Поскольку P наследует все от человека, Клиент теперь наследует все от p, которое унаследовано от Person. Теперь C наследуется от Клиента. Это хорошее понимание? –

+0

Да, это правильно. c наследует Client.prototype и если p.fullname = 'john', то c.fullname также будет «john», поскольку c наследует свойства в p (а также все, унаследованные самим p). –

+0

спасибо, что помогло. Мне нужно учиться немного больше, прежде чем я углубится в глубь. Похоже, этот материал довольно глубокий. –

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