Я два ума по этому поводу, является ли или не дубликат, или даже о том, не следует разбивать на несколько вопросов. Тем не менее, так как это привлекает ответы сомнительного качества, пропустите свой код по строкам.
function Person(){
this.a = function(){alert("a")};
}
Определяет функцию Person. Пока ничего особенного. Вызов Person()
будет, в зависимости от того, работает ли он в строгом режиме, выдает ошибку «не может установить свойство» «неопределенного» или он будет создавать глобальную переменную «a», поскольку vaue является функцией, которая предупреждает «a», ,
Однако, по соглашению, капитализированные функции в Javascript должны быть конструкторами и вызываться с помощью оператора new
. Вызов new Person()
делает для вас волшебство. Он создает новый объект и устанавливает его в значение this
в функции конструктора. Новый объект также неявно возвращается конструктором, поэтому он не имеет оператора возврата. Значение нового человека имеет метод a, который предупреждает «a» при вызове.
Но это редко делается на практике, использование прототипа является гораздо более распространенным явлением. Оператор new
также устанавливает внутренний прототип вновь созданного объекта как значение свойства функции конструктора .prototype
(объект фактически не получает свойство .prototype
). Все, что определено в объекте конструктора .prototype
, будет доступно для каждого экземпляра, созданного путем вызова этого конструктора с помощью new
.
Person.prototype.b = function(){alert("b")};
Это определяет функцию Ь на личности (функция конструктора) 'ы .prototype
объекта. Он будет доступен для всех созданных экземпляров Лица, сделанных по телефону new Person()
. Его также можно вызвать непосредственно Person.prototype.b()
. Этот метод лучше, чем тот, который используется для присоединения метода «а», потому что все люди разделяют значение «b», но все имеют свою собственную копию «a».
Person.c=function(){alert("c")};
В JavaScript все является объектом, в том числе функции. Объекты могут иметь назначенные им свойства. Здесь вы назначаете функцию для свойства c самой функции Person. Если вы привыкли к языкам на основе классов, это похоже на статический метод класса.
Надеюсь, к тому времени остальное станет яснее. Каждый человек, включая 'test', будет иметь метод 'a', потому что конструктор назначает его. Но прототип человека не имеет метода «а», его просто назначают в конструкторе. Прототип человека имеет метод «b», то есть все экземпляры Person имеют доступ к этому общему методу «b». Сама функция Person имеет метод «c», но она не передается экземплярам, поэтому «test» не имеет метода «c».
Только функции имеют объект 'prototype',' test' - это объект. '' 'не определен в' Person.prototype', но 'b'. – Teemu
Возможный дубликат [Понимание прототипного наследования в JavaScript] (http://stackoverflow.com/questions/892595/understanding-prototypal-inheritance-in-javascript) –
@JaredSmith, вы ошибаетесь, связанный с вами вопрос не имеет отношения со статическими свойствами и свойствами экземпляра. Пожалуйста, оставьте свой комментарий – frankies