2014-10-31 2 views
1

На MDN они заявляют следующее:JavaScript ООП концепции - Свойства

Свойства переменные, содержащиеся в классе; каждый объект объекта имеет эти свойства. Свойства должны быть установлены в прототипе property класса (функции) , чтобы наследование корректно работало.

Глядя на секциях Я настроил полужирный я предположил, что это означало:

myClass.prototype.newProperty = ... 

Однако их пример показывает следующее:

function Person(firstName) { 
    this.firstName = firstName; 
    console.log('Person instantiated'); 
} 

var person1 = new Person('Alice'); 
var person2 = new Person('Bob'); 

// Show the firstName properties of the objects 
console.log('person1 is ' + person1.firstName); // logs "person1 is Alice" 
console.log('person2 is ' + person2.firstName); // logs "person2 is Bob" 

В своем примере они добавляя свойство 'firstName' непосредственно к классу/функции, используя 'this'.

Означает ли это:
a) Что такое объявление функции - прототип? То есть myClass - прототип, который также имеет прототип свойства, который по умолчанию установлен на Object?
b) Это использование «этого». в объявлении функции на самом деле добавить свойство к myClass.prototype

Edit: Обновлен название

+0

Прототип является общим и обычно является поведением или неизменными элементами данных по умолчанию. this.someProp подробно описывается здесь подробно: http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR

+0

Это предложение кажется мусором. Где именно они это утверждают? Либо мы пропустим его контекст, либо он должен быть исправлен. – Bergi

+0

@Bergi Комментарий можно найти здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript – Jacques

ответ

2

JavaScript классы не, перестать думать в классах, потому что не работает с JavaScript (да, даже с синтаксисом ES6 class, это просто сахар, в JavaScript нет реальных классов).

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

Создание нового объекта с new ключевого слова довольно проста:

  1. Создайте пустой объект
  2. Сделать что объект прототипа тот же прототип, как конструктора
  3. Вызвать конструктор с this, как вновь созданный объект.

Таким образом, добавив свойство прототипа объекта будет иметь его общий для всех экземпляров одного и того же конструктора, при добавлении его в this в конструкторе будет иметь его только на данном конкретном случае. Поскольку он установлен в конструкторе, можно с уверенностью предположить, что все экземпляры будут иметь эту переменную в них, хотя он не будет использоваться совместно со всеми другими экземплярами.

При вызове свойства JavaScript, двигатель будет искать его в следующем фьюжн:

  1. Посмотрите на имущество, находящееся на самом объекте (это this внутри методов этого объекта)
  2. Если не найден, искать свойства на прототип объекта
  3. Если не найден, идти вверх по цепочке прототипов и искать его там

Таким образом, в вашем примере Person, цепочки поиска будет выглядеть следующим образом:

this > Person.prototype > Object.prototype 

застройщика, будет выглядеть следующим образом:

this > Person.prototype > Function.prototype > Object.prototype 

Лицо является функцией, поэтому ее прототип унаследовал от Function.prototype , аналогично любая функция является объектом.

Так конкретные вопросы:

  1. Функция декларация не является прототипом. См. Процесс создания объекта выше.
  2. Нет, this применяет свойство к этому экземпляру, в то время как prototype является общим для всех экземпляров.
+0

Спасибо. Я использовал слово class только потому, что MDN ссылался на него. По правде говоря, я исхожу из фона C#, поэтому мой взгляд несколько искажен. Вот почему я просматриваю различные фрагменты документации, чтобы понять, как правильно использовать ООП в JavaScript и не теряться в реализации C# и JavaScript. – Jacques

+0

Кстати, при определении языка как ООП понятие класса рассматривается как нечто, имеющее атрибуты и поведение. В вашем ответе вы использовали многие другие термины OOP, такие как Object, Constructor, Inheritance и т. Д., Где конструктор фактически является той же функцией, что и класс OOP. Я стараюсь не думать в C#, а скорее в терминах ООП, что заставляет меня думать, что ваша функция конструктора по существу и по стандартам ООП - это класс. Я понимаю, что проблема возникает, когда люди путают реализации. – Jacques

+0

Попробуйте избавиться от мышления в классах при разработке JavaScript OOP. Объекты наследуются от других объектов, а не от классов. Если вы можете получить это, чтобы «щелкнуть» внутри вашего разума, вам будет легче: –

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