Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.01.2013, 00:10
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Что такое {}.prototype?
Часто вижу запись навроде ... = {}.prototype = ... А что это такое и как его можно использовать, не нашел. Подскажите пожалуйста?
Ответить с цитированием
  #2 (permalink)  
Старый 10.01.2013, 10:09
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

http://learn.javascript.ru/prototype...о-f-prototype
Ответить с цитированием
  #3 (permalink)  
Старый 10.01.2013, 14:40
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо за ответ.
Если быть более точным, то записи могут быть разные, например как здесь
developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice
Выражение навроде, {}.prototype, я написал обобщенно, т.е. это может быть к примеру Function.prototype.call
хотя вопрос возник после попытки создать прототип таким способом
function root(){}
root.prototype = { root :"свойство root" }
function user() {}
user = {}.prototype = root;
var u = new user();


При явном создании функций-конструкторов роль prototype мне кажется понятно, т.е. prototype является ссылкой на свойства родителя. А роль при использовании глобальных, и/или предопределенных объектов в мне не понятна

Учитывая, что консоль вернула мне

{}.prototype — SyntaxError
Object.prototype — Object {}
[].prototype — undefined
Array.prototype — []

я так понял в моем коде {}.prototype роли как таковой не играет, т.е. я присвоил root сразу и user и {}.prototype, но учитывая, что {}.prototype синтаксическая ошибка, то вызвать я его не могу. С другой стороны не ясно, почему сама запись «user = {}.prototype = root», ошибки не вызвала?

Буду признателен за пояснение, или более развернутую информацию, где описывается использование подобных синтаксисов
Ответить с цитированием
  #4 (permalink)  
Старый 10.01.2013, 16:40
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Свойство prototype нет смысла задавать объектам (смысл есть только для конструктора). Почему {}.prototype можно использовать только справа от знака "=" я не в курсе.

Array и Object - это конструкторы. При создании объектов через них, прототипом будет соответственно пустой массив и объект.

У объекта нет свойства prototype (typeof {}.prototype === "undefined")
Ответить с цитированием
  #5 (permalink)  
Старый 10.01.2013, 17:24
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

{}.prototype - пишет вообще синтаксическая ошибка
Object.prototype, выдает набор свойств
А вот если создать объект, даже пустой,
var o = {}
то консоль выдает, что это объект, у которого есть одно единственное свойство __proto__, которое обладает свойствами Object.prototype
И насколько я понимаю, любой объект наследует свойства у Object.prototype
Хотя не могу сказать, что я до конца все понимаю, но как-то так вроде
Т.е. если я правильно понимаю, то получается что-то навроде o ссылается Object.prototype, в котором и ищет все свои свойства.
Ответить с цитированием
  #6 (permalink)  
Старый 10.01.2013, 18:14
Аспирант
Отправить личное сообщение для Sanda Посмотреть профиль Найти все сообщения от Sanda
 
Регистрация: 12.10.2012
Сообщений: 90

{}.prototype выдаёт ошибку в консоли, потому что {} - это не только новый объект, но и границы блока. ({}.prototype) в консоли работает верно.
Для предопределённых объектов (типа Object, Array и т.д.) прототипы имеет смысл изменять только в одном случае - эмуляция новых методов ECMAScript для старых браузеров, которые не поддерживают данные методы. Скажем, для функций часто используется .bind - привязка функции к контексту, но IE8 эту функциональность не поддерживает, поэтому приходится писать что-то вроде:
if (!Function.prototype.bind) {
  Function.prototype.bind = function () {
    //emulating code
  }
}
Ответить с цитированием
  #7 (permalink)  
Старый 10.01.2013, 18:25
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо за ответ.
А Object.prototype и {}.prototype получается разные значения, раз в консоли они выдают мне разный результат И если так, то в чем их разница?
Ответить с цитированием
  #8 (permalink)  
Старый 10.01.2013, 21:38
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Object - это конструктор. У него задано свойство prototype.
(new Object()) или, {} - это объект, у него нет свойства prototype. У него есть только скрытая ссылка на прототип - __proto__ (не во всех js-движках доступно), которая ссылается на prototype конструктора.

Еще раз - задавать prototype нужно только констукторам. У объектов нет такого свойства.

Sanda, спасибо за пояснение.
Ответить с цитированием
  #9 (permalink)  
Старый 10.01.2013, 21:57
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Object -> Object.prototype
Function -> Function.prototype -> Object.prototype
Т.е. Object.prototype является своего рода родителем всех объектов (к которым в том числе относятся и функции), как предопределенных, так и нет. Сначала свойства и методы ищутся у самого объекта, а потом по порядку у всех его прототипов, в том числе пока не дойдут до Object.prototype.
Правильно я понимаю?
Предполагаю даже, что конструкторы создаются именно за счет того, что в Function.prototype содержатся все необходимые для этого методы и свойства. И если я прав, то было бы не лишним узнать какие именно.

Также здесь описано, что можно переопределить свойство Object.prototype. И насколько я понимаю, то же самое можно сделать и для свойств других предопределенных объектов. Не ясно только, как это все происходит, т.е. как мне назначить скажем новое свойство или метод, а самое главное, проверить и посмотреть (убедиться), что все получилось.

Последний раз редактировалось platedz, 10.01.2013 в 23:03.
Ответить с цитированием
  #10 (permalink)  
Старый 11.01.2013, 12:10
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Подскажите, пожалуйста

Например я создаю метод для Object.prototype
Object.prototype.forin = function(){var result = ""; for(i in this) {result += i + ": "+this[i] +"\n"} return result;}
var ob = {a:"a",b:"b"}
alert(ob.forin());


Я могу увидеть этот метод если наберу в консоли Object.prototype
Могу ли я как-то по другому получить доступ к его свойствам и методам? Например
for(i in Object.prototype) document.write( i+ ": '" +  Object.prototype[i] + "', <br>");

Не получается.

Вопрос второй.
Как я могу посмотреть те же свойства и методы (пусть даже через консоль) у других предопределенных объектов, например Array.prototype и Function.prototype? Включая и предопределенные методы
Вопрос третий. Вышеуказанный метод, который я создал выводит не совсем то, что я хочу

a: a
b: b
forin: function (){var result = ""; for(i in this) {result += i + ": "+this[i] +"\n"} return result;}


а мне нужно получить только
a: a
b: b

Как этого добиться?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что такое "клиентская библиотека"? jsuse Общие вопросы Javascript 3 27.04.2012 01:50
Что такое class и для чего они нужны нуб Общие вопросы Javascript 6 29.11.2011 22:31
фрактальный сыр x-yuri Оффтопик 76 23.11.2011 20:59
Браузер доказывает что не видит функцию SleepWalker Общие вопросы Javascript 7 17.06.2009 23:14
Что такое "javascript:document.login.submit()" i_live_in_Moscow Общие вопросы Javascript 21 30.09.2008 15:25