Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Понимание ООП в JavaScript (https://javascript.ru/forum/misc/3070-ponimanie-oop-v-javascript.html)

x-yuri 01.11.2010 17:41

давайте остановимся на том, что тот, кто умеет программировать без работы не останется. Или я не прав? ;)

eai 01.11.2010 18:39

По сути да, а вот на практике может и подругому получиться.
Приятели мои организовали конторку и бодро фигачели на VB + Office.
Бизнес анализ планирование всякое. Продукт был очень хороший.
Грил я им, переползайте на 1с!
"Что бы мы да боги компьютерные на этом говне работали..."
отвечали мне они.
Настал кризис. Нет больше ентой конторки.

OctoberTide 22.09.2012 16:54

Читал статьи, из раздела ЧаВо этого форума. Но у меня возникли проблемы.... Не совсем понимаю, чем свойство объекта prototype отличается от свойства __proto__ реализованного в некоторых движках. Они ссылаются на один и тот же объект?

oneguy 22.09.2012 19:37

Цитата:

Сообщение от OctoberTide (Сообщение 205919)
Читал статьи, из раздела ЧаВо этого форума. Но у меня возникли проблемы.... Не совсем понимаю, чем свойство объекта prototype отличается от свойства __proto__ реализованного в некоторых движках. Они ссылаются на один и тот же объект?

Нет, они обычно ссылаются на разные объекты.
У каждого объекта есть внутреннее свойство без имени (в спецификации его обозначают [[Prototype]], в некоторых браузерах оно доступно через __proto__, но это не имя его, а лишь способ доступа), которое обозначает его прототип. Во всех современных браузерах значение этого свойства доступно через Object.getPrototypeOf(obj). Цепочка прототипов объектов определяет путь, по которому у объекта при чтении или записи ищется свойство.
Свойство prototype - это обычное свойство с именем "prototype", которое могут иметь объекты. Все пользовательские функции обязательно имеют это свойство, объекты не являющимися функциями могут иметь его, а могут и не иметь. Это свойство особенно полезно, когда пользовательская функция вызывается как конструктор: у новосозданного объекта устанавливается прототип (безымянное свойство, о котором говорилось раннее) равным значению свойства prototype конструктора.
Прототипом любой функции является начальное значение Function.prototype. За исключением того, что начальное значение Function.prototype само является функцией.

OctoberTide 23.09.2012 11:28

oneguy
Спасибо за подробный ответ! Очень благодарен. Стал читать спецификацию ECMA-262 5.1 и некоторые моменты становятся яснее.

monolithed 23.09.2012 19:53

var object = {};
object.constructor.prototype = null;
alert(object.toString);

var object = {};
object.__proto__ = null;
alert(object.toString);

PashPP 24.09.2012 17:19

Подписался на тему, хоть еще не листал.

Взываю в тему годных и интересных (и несложных) задачек на ООП, ну и судью моего скромного решения оной.

Nubi 25.09.2012 13:26

Хотелось бы проверить понимание примеров, приведенных monolithed.
Фактически и
Код:

object.constructor.prototype
и
Код:

object.__proto__
указывают на один и тот же объект.

В первом случае делая так:
Код:

object.constructor.prototype = null;
мы лишь затираем ссылку на объект, но он по прежнему доступен как object.__proto__ (object.[[Prototype]]).
Во втором случае
object.__proto__ = null;
получается потеряна не только ссылка
Код:

object.[[Prototype]]
но и
Код:

object.constructor.prototype
т.к. у объекта (прототипа) больше не существует свойства constructor.
Раз на объект (прототип) больше не указывает не одной ссылки, он уничтожается сборщиком мусора.
Верно ли я понял? :blink:

oneguy 25.09.2012 19:24

Нет, неверно.
При выполнении object.constructor.prototype=null ничего не происходит, потому что object.constuctor равняется Object, а в нём свойство prototype имеет атрибут writable: false. В строгом режиме выдаётся ошибка.
"use strict";
var object = {};
object.constructor.prototype = null;

При выполнении object.__proto__ = null, у object прототип меняется с Object.prototype на null, при этом объект Object.prototype продолжает существовать, так как на него ещё ссылается много ссылок.

Nubi 25.09.2012 19:58

oneguy,
Ага, получается что строка object.__proto__ = null; просто разрывает связь текущего объекта object с его прототипом Object.prototype, правильно?
Тогда такой вопрос, раз Object.prototype продолжает существовать, его как-то можно уничтожить (не в смысле "зачем", просто любопытно)?


Часовой пояс GMT +3, время: 23:15.