Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.219.217] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте всем,
для тех кто путает объекты, прототипы, классы и не может разобраться что да как, Гений ща все разжует! итак объект создается с помощью литерала: var o = {}; добавляем свойства o.prop1 = 'hello'; o.prop2 = 100; o.prop3 = [1,2,3,4,5]; o.prop4 = {}; o.prop5 = function(){}; // и т.д. у объекта есть скрытое свойство [[Prototype]]. Прототип это ссылка на другой объект, который используется движком JS. Доступ к нему закрыт (в ES3/ES5), но в ES6 доступ в нему можно получить через метод Object.setPrototypeOf, кроме того некоторые браузеры предоставляют доступ к прототипу через свойство __proto__. Устал печать пока все |
Сообщ.
#2
,
|
|
|
с нетерпением ждём продолжения книги.
|
Сообщ.
#3
,
|
|
|
Цитата Cfon @ у объекта есть скрытое свойство [[Prototype]] Нету. Прототип есть только у функций и проч |
Сообщ.
#4
,
|
|
|
Цитата K313 @ с нетерпением ждём продолжения книги. да дружище скоро будет Добавлено Цитата Serafim @ Цитата Cfon @ у объекта есть скрытое свойство [[Prototype]] Нету. Прототип есть только у функции дружище ты меня удивляешь своим не знанием предмета! но ничего скоро я все разжую и объясню что там да как |
Сообщ.
#5
,
|
|
|
Даже не пойму, то ль это реально фейспалм, то ли просто троллинг
|
Сообщ.
#6
,
|
|
|
Мы с такой скоростью подачи материала будем учиться до тришкиного заговения. ТС, можешь побыстрей новый материал выдавать? Но не очень быстро, а то я конспектирую.
|
Сообщ.
#7
,
|
|
|
Цитата MIF @ Мы с такой скоростью подачи материала будем учиться до тришкиного заговения. ТС, можешь побыстрей новый материал выдавать? Но не очень быстро, а то я конспектирую. жди! |
Сообщ.
#8
,
|
|
|
Продолжаю вещать!
JavaScript слаботизирован, т.е. тип переменной не указыватся и он может динамически меняться вовремя выполнения кода. В JavaScript существует несколько элементарных типов данных: числа(number), строки(string), логические(boolean), и объектный тип (object), кроме того есть еще тип undefined - означает не определенный тип. В ES6 появился новый тип symbol, думаете что это символьный тип? Ошибаетесь! Если в двух словах это тип который определяет некое уникальное значение Тип переменной можно определить с помощью оператора typeof, например: var i = 0, s = 'hi', o1 = {}, o2; typeof i; // 'number' typeof s; // 'string' typeof o1; // 'object' typeof o2; // 'undefined' К объектам относятся также функции, но они имеют тип 'function' var foo = function() {}; typeof foo; // 'function' Объекты представляют из себя коллекции свойств - пар: ключ/значение. В переменных хранятся только ссылки на объекты, а сами объекты хранятся в куче. Что это значит? Например: var o1 = { a: 100 }; var o2 = o1; o1 = { b: 200 }; console.log(o1); // { b: 200 } console.log(o2); // { a: 100 } Давайте проанализируем ,что тут происходит: -- определяется переменная o1 -- создается объект в куче(со свойтсвом a и значением 100) -- ссылка на этот объект записывается в o1; -- определяется переменная o2 и связывается с объектом на который указывает o1; -- создается новый объект со значением {b: 200} -- ссылка на объект записывается в o1. Что тут важно отметить, o1 больше не указывает на объект {a:100}, но o2 по-прежнему ссылается на {a:100}, т.е. операция o2 = o1 определяет не ссылку на o1, а новую связь с объектом {a:100}, поэтому после o1 = { b: 200 } ссылка o2 по-прежнему указывает на {a: 100}, а o1 -> {b:200}. Вооот! Там еще есть ссылка на прототип, она неявно создается при создании объекта, т.е на самом деле будет что-то типа { a: 100, __proto__: Object.prototype } но об этом в след раз to be continue... |
Сообщ.
#9
,
|
|
|
Продолжаю
В приведенном выше примере присутствует свойство __proto__, которому присвоено значение Object.prototype. Эту связь добавляет сам JavaScript. Что это означает? Object это функция, которая уже определена в JavaScript, а у нее есть свойство prototype. Скажу больше, у каждой определяемой нами функции есть свойство prototype со значением { constructor: имя_функции }, где имя_функции это имя функции , в данном случае Object. Обратите внимание на название свойства constructor, по данной причине саму функцию часто называют конструктор. Свойство prototype это особое свойство функции, которое используется движком JavaScript при создании объекта через оператор new (пока я опущу его описание ). Так вот в этом Object.prototype содержится ссылка на объект, в котором определены несколько методов: -- toString, valueOf, haOwnProperty, isPrototypeOf и т.д. Строка __proto__: Object.prototype добавляется неявно самим JavaScript. Свойство __proto__ используется для связывания объектов в цепочки, с помощью которых отслеживаются разрешения обращения к свойствам объекта. В нашем примере мы связали, точнее сам JavaScript связал , наш объект "o" с объектом Object.prototype через свойство __proto__. Не путайте __proto__ со свойством prototype функции! Это разные свойства, первое присутствует в объекте, второе в функции. Но оба они указывают на один и тот же объект в куче. Как работает цепочка прототипов? Например: var o = { a: 100 }; o.toString(); // [object Object] Казалось бы в нашем объекте нет метода toString, но он есть в прототипе Object.prototype. Что делает JavaScript: -- JavaScript ищет метод toString сначала в самом объекте "o", -- не обнаружив его, переходит по ссылке __proto__ к объекту Object.prototype. -- Тут он есть, происходит его вызов. Конец В нашем случае цепочка короткая, но ее можно расширить, связать несколько объектов, например: var o1 = { a: 100 }; var o2 = { b: 200, __proto__: o1 }; o2.b; // OK: 200 o2.a; // OK: 100 o2.toString(); // OK: [object Object] Если запрашиваемого свойства не оказалось в текущем прототипе, то поиск продолжится дальше по цепочке пока не дойдет до Object.prototype, где его __proto__ равен null, на этом поиск закончится и произойдет ошибка TypeError: o.foo(); // TypeError: o.foo is not a function Здесь я несколько упростил, используя __proto__, как правило его лучше не трогать поскольку оно не стандатизировано, хотя вроде в ES6 уже стандартизировано . Как же тогда связывать объекты в цепочки? Для назначения объекта свойству __proto__ существует несколько способов, кроме прямого обращения к __proto__, а именно: -- свойство prototype функции, да-да то самое, что я упоминал выше -- Object.create (ES5) -- Object.setPrototypeOf (ES6) например: var o1 = { a: 100 }; var o2 = { b: 200 }; Object.setPrototypeOf(o2, o1); o2.b; // OK: 200 o2.a; // OK: 100 o2.toString(); // OK: [object Object] или var o1 = { a: 100 }; var o2 = Object.create(o1, { value: {b: 200 }}); или var o1 = { a: 100 }; function F() {} F.prototype = o1; //<-- а вот ана prototype :D var o2 = new F(); o2.b = 200; В последнем примере как раз используется оператор new. Что он делает? -- создает новый объект (пустой) и связывает его со ссылкой this (она используется внутри конструктора) -- далее вызывает конструктор F (он у нас ничего не делает, но без него никак ) -- ссылка на F.prototype связывается с this.__proto__ -- и наконец ссылка на новый объект связывается с o2. Обратите внимание объект o2 во втором и треьем примере не использует литерал. Я скажу больше эти способы практически одинаковые! Object.create был введен в ES5 и реализован так же как в последнем случае, т.е. через временный конструктор F с добавлением разных проверок и передачи объекта инициализации. На сегодня все! to be continue... |
Сообщ.
#10
,
|
|
|
Цитата Cfon @ Object это функция, которая уже определена в JavaScript, а у нее есть свойство prototype. {}.protoype Странно, у моего объекта нету protoype ({})() И это не функция! Обманщик! Дизлайк, отписка!!!111 |
Сообщ.
#11
,
|
|
|
Цитата Cfon @ Продолжаю верещать! фиксед |
Сообщ.
#12
,
|
|
|
Цитата Serafim @ Цитата Cfon @ Object это функция, которая уже определена в JavaScript, а у нее есть свойство prototype. {}.protoype Странно, у моего объекта нету protoype {} это не функция, это же литерал объект естествено у объекта нет никакого свойства prototype, у него есть __proto__, а вот у функции есть prototype. читай внимательно я не обманщик, я Гений! Добавлено Цитата _lcf_ @ Цитата Cfon @ Продолжаю верещать! фиксед пшол отседа пацан! |
Сообщ.
#13
,
|
|
|
Цитата Cfon @ естествено у объекта нет никакого свойства prototype Но ведь же: Цитата Cfon @ Object это функция, которая уже определена в JavaScript, а у нее есть свойство prototype. 1) typeof {} // "object" 2) Это объект, а объект - это функция, ты так написал. |
Сообщ.
#14
,
|
|
|
Цитата Serafim @ Цитата Cfon @ естествено у объекта нет никакого свойства prototype Но ведь же: Цитата Cfon @ Object это функция, которая уже определена в JavaScript, а у нее есть свойство prototype. 1) typeof {} // "object" 2) Это объект, а объект - это функция, ты так написал. не тупи, я написал не объект, а Object - это функция, что тут не ясно? |
Сообщ.
#15
,
|
|
|
Цитата Cfon @ ты для кого книгу пишешь? для самого себя? Если народ твой метод изложения материала не понимает - значит хреновый из тебя писатель...пшол отседа пацан! Прикладывай разукрашки, и понятнее будет и писанины будет меньше например Добавлено Цитата Cfon @ Вот так ты и запутаешь всех своих дорогих читателей. не тупи, я написал не объект, а Object - это функция, что тут не ясно? Ты же ещё не объяснил, что любые функции в javascript - это функции лижь с точки зрения пользователя, потому что их можно вызвать. А с точки зрения самого javascript - это объекты типа "function" |