<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3803646</guid>
        <pubDate>Sat, 13 Jul 2019 05:21:03 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3803646</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415097&view=findpost&p=3802965'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-07-07T06:46:52+03:00">07.07.19, 03:46</time></span><div class='quote '>также заюзал Object.defineProperty для восстановления связи прототипа с конструктором</div></div><br>
Можно сразу определить constructor в proto, Object.defineProperty уже не требуется:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp;Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var proto = Object.create(this.prototype, {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;constructor: { //&#60;-- определяем constructor в proto</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;value: Class</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;});</div><div class="code_line">...</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802973</guid>
        <pubDate>Sun, 07 Jul 2019 06:05:44 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802973</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415097&view=findpost&p=3802676'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Cfon &#064; <time class="tag-quote__quoted-time" datetime="2019-07-04T16:42:41+00:00">04.07.19, 16:42</time></span><div class='quote '>- Понятно Маста&#33; Но как это относится к стрелочной или обычной нотации функции?  :huh:<br>
<br>
Новичок дело в том что контекст в функции определяемой через function, если она не принадлежит объекту всегда является глобальный объект Window или global. Если же функция объявлена через стрелочную нотацию контекст внутри нее не меняется и является тем же что и в зоне ее определения, или (как возможно ты слышал) ее называют лексической областью видимости. Т.е. в нашем случае это будет функция Object.<br>
На самом деле в данном случае это не имеет значения, т.к. внутри нашей стрелочной функции мы не юзаем конткест, поэтому ее можно заменить на обычную нотацию. А вот если заменить на стрелочную функцию, функцию которая присваивается объекту proto (см коммент 2), то контекст будет тем же что и в зоне ее определения, т.е. функция Object, что как ты понимаешь приведет к некорреткной работе кода вызова методов из анонимного объекта. Вот поэтому я юзал обычную нотацию в случае функции присваиваемой proto, а в случае колбэка forEach по привычке юзал стрелочную нотацию. </div></div><br>
Другое более понятное объяснение заключается в том, что каждое объявление функции неявно включает ссылку на контект this, значение которого зависит от того как была вызвана функция. В случае же со стрелкой this не определяется и как следствие юзается this внешней функции, если конечно она не является также стрелкой.]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802965</guid>
        <pubDate>Sun, 07 Jul 2019 03:46:52 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802965</link>
        <description><![CDATA[Cfon: Решил проблему двух вызовов конструкторов через копирование прототипа, вместо введения переменной isCreatingObject, также заюзал Object.defineProperty для восстановления связи прототипа с конструктором и заключил все в условие, согласно форме написания полифила :D:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if (!Object.extends) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var proto = Object.create(this.prototype); //&#60;-- копируем this.prototype</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Object.keys(props).forEach(key =&#62; { &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto[key] = /_super/.test(props[key]) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;? function (...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key].call(this, ...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: props[key]; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;});</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;function Class(...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.__constructor &amp;&amp; this.__constructor(...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Class.prototype = proto;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Object.defineProperty(Class.prototype, &#39;constructor&#39;, {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;enumerable: false,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;value: Class</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;});</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Class.extends = _extends;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return Class;</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802703</guid>
        <pubDate>Fri, 05 Jul 2019 03:51:25 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802703</link>
        <description><![CDATA[Cfon: - Маста, я тут снова перечитал ваши посты и не понел откуда таки в примере поста #1 появляется Gregory?    :huh:<br>
<br>
Новичок ты меня таки поймал :D<br>
Давай исследуем откуда этот Gregory взялся. В том примере у нас идет привязка к анонимному объекту, что передается в качестве параметра в extends, таким образом он и будет нашим контекстом при вызове __constructor:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var Person = Object.extends({</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.name = name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getName() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">});</div><div class="code_line">&nbsp;</div><div class="code_line">var gregory = new Person(&#39;Gregory&#39;); //&#60;-- вызов __constructor в контексте анонимного объекта</div></ol></div></div></div></div><br>
это приведет к появлению свойства name со значением &quot;Gregory&quot; в этом объекте, я визуализирую состояние объекта:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;name: &quot;Gregory&quot;, //&#60;-- новое свойство name</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.name = name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getName() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
Далее идет вызов Person.extends, который приводит к тому что JavaDrocher &quot;наследует&quot; свойства Person, который как ты помнишь из-за неправильного контекста ссылается на наш анонимный объект, вместо Person.prototype:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var JavaDrocher = Person.extends({</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name, grade) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.grade = grade;</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getGrade() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.grade;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">});</div></ol></div></div></div></div><br>
таким образом вызов mark.getName<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var mark = new JavaDrocher(&#39;Mark&#39;, 10);</div><div class="code_line">mark.getName();</div></ol></div></div></div></div><br>
приведет к обращению getName из нашего анонимного объекта, в котором свойство name уже определен со значением &quot;Gregory&quot;, оно и будет возвращено. Вроде все верно отследил :D <br>
<br>
- Маста дайте мне время я это переварю  :jokingly: <br>
<br>
Ок Новичок&#33;]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802676</guid>
        <pubDate>Thu, 04 Jul 2019 16:42:41 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802676</link>
        <description><![CDATA[Cfon: - Маста, а почему в вашем коде юзается то стрелочный синтаксис то обычный? <br>
- с вашего позволения я убрал улучшения, чтобы код стал компактнее :D <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var proto = new this(); </div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Object.keys(props).forEach(key =&#62; { &nbsp;//&#60;-- стрелочная</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;proto[key] = function (...args) { //&#60;-- обычная</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key].call(this, ...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;});</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Class(...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.__constructor &amp;&amp; this.__constructor(...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.prototype = proto;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.extends = _extends;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return Class;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">var Person = Object.extends({</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.name = name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getName() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">});</div><div class="code_line">&nbsp;</div><div class="code_line">var gregory = new Person(&#39;Gregory&#39;);</div><div class="code_line">console.log(gregory.getName());</div></ol></div></div></div></div><br>
Хороший вопрос Новичок :D<br>
Суть в контексте. Как ты наверное знаешь доступ к контексту выполняется через this. Функция extends имеет несколько зон обращения к контексту (я обозначил их комментариями):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var proto = new this(); //&#60;-- 1</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;Object.keys(props).forEach(key =&#62; { </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;proto[key] = function (...args) { </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; //&#60;-- 2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key].call(this, ...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;});</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Class(...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.__constructor &amp;&amp; this.__constructor(...args); //&#60;-- 3</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.prototype = proto;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.extends = _extends;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return Class;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">var Person = Object.extends({</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.name = name; //&#60;-- 4</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getName() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">});</div></ol></div></div></div></div><br>
Так вот в первом случае контекстом будет Object, во втором - proto, в третьем - зависит от того как будет вызван Class, простой вызов Class() определит в качестве контекста объект Window или global, если же через new Class(), то это будет новый объект. В четвертом - также зависит от того как будут вызваны методы анонимного объекта, мы уже говорили об этом в предыдущих постах, если ты забыл я напомню. Посмотри на код сразу после комментария 2: props[key].call(this, ...args) тут как раз идет вызов методов из нашего анонимного объекта, как видишь я вызываю их через call с передачей контекста this, который как я уже написал является объектом proto.<br>
<br>
- Понятно Маста&#33; Но как это относится к стрелочной или обычной нотации функции?  :huh:<br>
<br>
Новичок дело в том что контекст в функции определяемой через function, если она не принадлежит объекту всегда является глобальный объект Window или global. Если же функция объявлена через стрелочную нотацию контекст внутри нее не меняется и является тем же что и в зоне ее определения, или (как возможно ты слышал) ее называют лексической областью видимости. Т.е. в нашем случае это будет функция Object.<br>
На самом деле в данном случае это не имеет значения, т.к. внутри нашей стрелочной функции мы не юзаем конткест, поэтому ее можно заменить на обычную нотацию. А вот если заменить на стрелочную функцию, функцию которая присваивается объекту proto (см коммент 2), то контекст будет тем же что и в зоне ее определения, т.е. функция Object, что как ты понимаешь приведет к некорреткной работе кода вызова методов из анонимного объекта. Вот поэтому я юзал обычную нотацию в случае функции присваиваемой proto, а в случае колбэка forEach по привычке юзал стрелочную нотацию. <br>
<br>
- ВАУ МАСТА&#33; На это мне потребуется время, чтобы я все перевалил :wacko: <br>
- СПАСИБО&#33; Я перечитаю пост несколько раз :thanks:]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802634</guid>
        <pubDate>Thu, 04 Jul 2019 07:54:02 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802634</link>
        <description><![CDATA[Cfon: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=415097&view=findpost&p=3802625'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>K313 &#064; <time class="tag-quote__quoted-time" datetime="2019-07-04T06:16:48+00:00">04.07.19, 06:16</time></span><div class='quote '>а где:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class A extends B</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;const A = &#39;aaa&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public c;</div><div class="code_line">&nbsp;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
?</div></div><br>
Цели написать полный аналог классов ESNext не было, цель была поупражняться с JS ну еще раз вспомнить прототипы, замыкания. К тому же лично я не юзаю эти дела, не прижилось в моей практике.]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802625</guid>
        <pubDate>Thu, 04 Jul 2019 06:16:48 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802625</link>
        <description><![CDATA[K313: а где:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class A extends B</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;const A = &#39;aaa&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;protected b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public c;</div><div class="code_line">&nbsp;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
?]]></description>
        <author>K313</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802624</guid>
        <pubDate>Thu, 04 Jul 2019 04:54:15 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802624</link>
        <description><![CDATA[Cfon: Есть еще одна оптимизация кода смотрите на след кусок кода<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Object.keys(props).forEach(key =&#62; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto[key] = function (...args) { </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; //&#60;-- создается ссылка на метод из прототипа </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key].call(this, ...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;});</div><div class="code_line">...</div></ol></div></div></div></div><br>
тут при обходе каждый раз создается новая функция, которая подменяет оригинальную. Казалось бы ничего страшного, но если посмотреть на содержимое этой функции, то вы увидите, что единственое что она делает это выставляет ссылку на метод из прототипа. Спрашивается а зачем нам нужна ссылка на метод из прототипа, если мы ее не используем. Так в моем примере эта ссылка юзается только в методе __constructor<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var JavaDrocher = Person.extends({</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name, grade) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this._super(name); //&#60;-- вот она</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.grade = grade;</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getGrade() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// а тут _super не юзается</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.grade;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">});</div></ol></div></div></div></div><br>
Делаем след оптимизацию, она не такая очевидная:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Object.keys(props).forEach(key =&#62; { &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto[key] = /_super/.test(props[key]) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;? function (...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key].call(this, ...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: props[key]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;});</div><div class="code_line">...</div></ol></div></div></div></div><br>
Данный код требует комментария  :D <br>
Строка /_super/.test(props[key]) тестирует тело метода на наличие в нем слова _super. Как это работает? Дело в том вызов test(props[key]) приводит к test(props[key].toString()), который возвращает содержимое метода в виде строки и таким образом мы имеем возможность проверить наличие обращения к _super. Если так то строим новый метод, если нет то просто ссылаемся на оригинальный метод. <br>
Тут еще остались косяки, но пока этого достаточно для общего развития  :D <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-07-04T05:32:09+00:00">04.07.19, 05:32</time></span></span><br>
- Маста, а почему вы юзаете переменную _super:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp;Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var _super = this.prototype; //&#60;-- тут</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;isCreatingObject = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var proto = new this();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;isCreatingObject = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Object.keys(props).forEach(key =&#62; { &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto[key] = /_super/.test(props[key]) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;? function (...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; //&#60;-- тут</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key].call(this, ...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: props[key]; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;});</div><div class="code_line">...</div></ol></div></div></div></div><br>
Новичок, это не просто переменная это замыкание, поскольку к ней мы обращаемся из другой функции. Это необходимо чтобы коректно определить контекст вызова метода из прототипа.<br>
<br>
- Как это? :huh: <br>
<br>
Смотри если ты напишешь просто this._super = this.prototype[key], то this.prototype[key] в момент вызова метода не будет указывать на метод прототипа, поскольку this будет ссылаться на созданный объект, а не функцию-конструктор. <br>
<br>
- Маста как же сразу не просек :wall:  <br>
<br>
Спокойно Новичок&#33; Голова нам еще пригодиться&#33; :D]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802623</guid>
        <pubDate>Thu, 04 Jul 2019 03:41:59 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802623</link>
        <description><![CDATA[Cfon: Обнаружен косяк  :D, конструктор класса в случае наследования вызывается два раза&#33; <br>
Первый раз когда собственно определяется класс JavaDrocher<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var JavaDrocher = Person.extends({</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name, grade) { </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this._super(name);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.grade = grade;</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getGrade() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.grade;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">});</div></ol></div></div></div></div>вызов Person.extends приводит к вызову Person.__constructor :blink:   <br>
Ну а второй раз как полагается при создании объекта mark тут вопросов нет. <br>
Исследуя код обнаружил место где это происходит. Вот этот кусок<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var proto = new this(); //&#60;-- тут!</div><div class="code_line">...</div></ol></div></div></div></div><br>
Решение такое надо определять момент определения класса и момент создания объекта. Например можно определить флажок isCreatingObject и окружить им оператор создания объекта proto:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">(function () {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var isCreatingObject;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;isCreatingObject = false; //&#60;-- раз </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;var proto = new this();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;isCreatingObject = true; //&#60;-- и два</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Object.keys(props).forEach(key =&#62; { &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto[key] = function (...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key].call(this, ...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;});</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;function Class(...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isCreatingObject &amp;&amp; this.__constructor &amp;&amp; this.__constructor(...args); //&#60;-- и три</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Class.prototype = proto;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Class.extends = _extends;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return Class;</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">})();</div></ol></div></div></div></div><br>
поскольку данный флажок проверяется также после определения класса в момент создания объекта, его необходимо вынести за пределы extends, но поскольку мы не хотим его делать глобальной, юзаем iife. Все теперь __constructor вызывается один раз при создании объекта<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var mark = new JavaDrocher(&#39;Mark&#39;, 10);</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802578</guid>
        <pubDate>Wed, 03 Jul 2019 01:35:39 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802578</link>
        <description><![CDATA[Cfon: - Маста, а можно без call?  :huh: <br>
<br>
Да&#33; Для этого надо просто скопировать функции в правильный контекст :D <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var proto = new this(); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const key in props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (props.hasOwnProperty(key)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto[key] = function (...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this[key] = props[key]; //&#60;-- копируем функции в контекст</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return this[key](...args); //&#60;-- вызываем </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Class(...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.__constructor &amp;&amp; this.__constructor(...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.prototype = proto;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.extends = _extends;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return Class;</div><div class="code_line">};</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802532</guid>
        <pubDate>Tue, 02 Jul 2019 08:42:55 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802532</link>
        <description><![CDATA[Cfon: Нашел баг, все дело было в контексте я вызывал методы внутри extends в не правильном контексте. Заменил простой вызов на вызов через call(this, ...args) теперь все пучком  :D <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var proto = new this(); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const key in props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (props.hasOwnProperty(key)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto[key] = function (...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key]; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// return props[key](...args); //&#60;-- ошибка: вызов в неправильном контексте</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key].call(this, ...args); //&#60;-- вызов в нужном контексте</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Class(...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.__constructor &amp;&amp; this.__constructor(...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.prototype = proto;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.extends = _extends;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return Class;</div><div class="code_line">};</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802521</guid>
        <pubDate>Tue, 02 Jul 2019 04:54:53 +0000</pubDate>
        <title>Иммитация классов в JS</title>
        <link>https://forum.sources.ru/index.php?showtopic=415097&amp;view=findpost&amp;p=3802521</link>
        <description><![CDATA[Cfon: Написал свою версию имитации класса :D, но работает странно, если не выполнять вызов _super в конструкторе JavaDrocher, то вызов mark.getName() возвращает &quot;Gregory&quot;&#33; Откуда тут Gregory? Как оно сюда попало? Должно undefined&#33; :wacko:<br>
Где я накосячил?  <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Object.extends = function _extends(props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var _super = this.prototype;</div><div class="code_line">&nbsp;&nbsp; &nbsp;var proto = new this(); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (const key in props) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (props.hasOwnProperty(key)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;proto[key] = function (...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this._super = _super[key];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return props[key](...args); &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function Class(...args) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.__constructor &amp;&amp; this.__constructor(...args);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.prototype = proto;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Class.extends = _extends;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return Class;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">var Person = Object.extends({</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.name = name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getName() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.name;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">});</div><div class="code_line">&nbsp;</div><div class="code_line">var JavaDrocher = Person.extends({</div><div class="code_line">&nbsp;&nbsp; &nbsp;__constructor(name, grade) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// this._super(name); //&#60;-- отключаем вызов _super</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this.grade = grade;</div><div class="code_line">&nbsp;&nbsp; &nbsp;},</div><div class="code_line">&nbsp;&nbsp; &nbsp;getGrade() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this.grade;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">});</div><div class="code_line">&nbsp;</div><div class="code_line">// tests</div><div class="code_line">var gregory = new Person(&#39;Gregory&#39;);</div><div class="code_line">var mark = new JavaDrocher(&#39;Mark&#39;, 10);</div><div class="code_line">&nbsp;</div><div class="code_line">console.log(gregory.getName()); // Gregory</div><div class="code_line">console.log(mark.getName()); // Gregory &#60;-- должно undefined!</div><div class="code_line">console.log(mark.getGrade()); // 10</div></ol></div></div></div></div>]]></description>
        <author>Cfon</author>
        <category>JavaScript, DOM/DHTML</category>
      </item>
	
      </channel>
      </rss>
	