@aivazovski

В чём разница между Array и Array.prototype?

Добрый день.
Читаю learn.javascript дошёл до реализации ООП на прототипах.
Я никак не могу понять назначение объект_какой_нибудь.prototype в LJS пишут, что это склад методов объекта. Но почему эти методы лежат не в самом объекте "объект_какой_нибудь" ?
Зачем нужно это свойство ?
  • Вопрос задан
  • 1691 просмотр
Решения вопроса 1
@undefined_title
Array - Функция конструктор которая нужна для создания массивов.
Array.prototype - Объект прототип, с набором методов, нужен для реализации прототипного наследования, к тому же имеется исключительно у функций, по умолчанию там храниться поле constructor, которое хранит ссылку на класс который создал этот объект.
При создании объекта через оператор new в том числе и массива, объекту присваивается .__proto__ = Array.prototype. __proto__, это и есть сам прототип, объект хранилище методов, в нем ищется поле когда не находиться у самого объекта.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
dollar
@dollar
Делай добро и бросай его в воду.
Array - функция
Array.prototype - объект

function f() {}
var o = new f();
console.log(o.x); //undefined
f.prototype.x = 123;
console.log(o.x); //123
var e = new f();
console.log(e.x); //123
e.x = 234;
console.log(e.x); //234
console.log(o.x); //123
f.prototype.x = 555;
console.log(e.x); //234
console.log(o.x); //555
console.log(o === e); //false
console.log(o.__proto__ === e.__proto__); //true
console.log(o.__proto__ === f.prototype); //true
console.log(o instanceof f); //true

Когда вы проверяете свойство объекта, то сначала оно ищется в самом объекте, и если его нет, то в прототипе. В самом объекте хранятся только его собственные свойства. А в прототипе хранятся свойства всех объектов данного класса. Если вы добавите свойство в прототип, то оно появится у всех объектов данного класса (если у них нет собственного свойства с таким же именем, которое будет перекрывать). Конечно, сам прототип тоже можно поменять, но это уже отдельная история. Можно много чего сделать, используя прототипы.

//Бонус
Array.prototype.couple = function(){return this[0] + this[1]};
[3,4,5].couple(); //7
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
let a = new Array()
let b = new Array()
let c = new Array()
let d = new Array()
// объектов может быть много, с ращзными данными
// и с разными методами
a.hello = ()=>console.log('Yarrr!') // теперь у объекта "a" есть новый метод
a.hello() // -> Yarrr!      его можно вызвать
// но если сделать b.hello() - будет ошибка


console.log('is same object?', a === b) // -> false объекты разные
console.log('is same prototype?', a.__proto__ === b.__proto__) // а прототоип одинаковый (общий)

// но при этом у каждого из них есть .length или .concat()
// потому что эти методы прописаны в прототипе
console.log(a.__proto__)
a.__proto__.tost = ()=>console.log('test') // а этот метод добавился всем
b.tost() // -> test
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы