ООП в Javascript

Помогите пожалуйста разобраться, есть ли какая-то принципиальная разница в двух следующих примерах?

function A(){
    this.a = 100;
    this.b = 200;
}
var a = new A();


function A(){
    this.a = 100;
}
A.prototype.b = 200;
var a = new A();


В разных местах встречал и тот и другой пример. Если есть разница, то в чем?
  • Вопрос задан
  • 6075 просмотров
Решения вопроса 1
@humblegenius
function С(){
    this.a = 100; 
    // this - это новый объект, который будет присвоен переменной o.
    // т.е. свойство "a" - это свойство создаваемого объекта
}
С.prototype.b = 200;
//С - формально  это функция, логически у нас - это класс. Любая функция имеет прототип, с помощью которого мы можем добавлять свойства и методы для класса
//т.е. свойство "b" - это свойство прототипа, которое наследуется при создании объекта класса
var o = new C();


Теперь немного практики:
var CThis;
function C(){
    alert(this.b); // 200 (b - уже есть, т.к. это свойство прописано в прототипе)
    this.a = 100;
    CThis=this; // сохраним для исследований
}
C.prototype.b = 200; // дополняем в класс новое свойство
var o = new C();

alert(CThis == o); //true 
alert(o.prototype); //undefined (у объекта нет прототипа)
alert(o.constructor==C); //true (у объекта есть конструктор)
alert(o.constructor.prototype==C.prototype); //true
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
UZER2006
@UZER2006
В первом случае вы добавляете атрибуты в новосозданный экземпляр, во втором – один из атрибутов добавлен в прототип.
function A(){this.a = 100; this.b = 200;}
var a = new A();
var b = new A();
function B(){this.a = 100;}
B.prototype.b = 200;
var c = new B();
var d = new B();
a //A {a: 100, b: 200}
b //A {a: 100, b: 200}
a.a = 150; b.b = 250;
a //A {a: 150, b: 200}
b //A {a: 100, b: 250}
c.a = 175;
B.prototype.b = 275;
c //B {a: 175, b: 275}
d //B {a: 100, b: 275}

У объектов c и d свойство b унаследовано из прототипа и оно одно на все экземпляры. У экземпляров объекта B нет «личного» свойства b То есть
a.hasOwnProperty('a') //true
a.hasOwnProperty('b') //true
c.hasOwnProperty('a') //true
c.hasOwnProperty('b') //false
Ответ написан
Комментировать
ghaiklor
@ghaiklor
NodeJS TechLead
В первом случае, при создании нового объекта var a = new A(), в этот объект будет каждый раз записываться значения a и b.
var a = new A(); var b = new A();
И в a, и в b будут свойства со значениями. И там, и там, будет лежать 100 и 200. То есть, попросту говоря, в первом случае каждый новый объект будет иметь в себе свойства a и b при его создании.
Во втором же случае объект при создании будет иметь лишь свойство a. Т.к. прототипы довольно интересная вещь и советую почитать о них статьи. Но уже при созданном объект будет и свойство b, т.к. прототипы, как уже сказалось выше, дополняют готовый объект. Единственное отличие в том, что все созданные объекты будут иметь каждый свое свойство a и одно свойство на всех b.
Прототипирование обычно используется для описания методов объекта. Создал конструктор, в котором описал все свойства объекта, а в прототипе описал методы объекта.
Ответ написан
Комментировать
freeek
@freeek
Разница? Зависит от контекста, а так: в первом случае вы явно указали свойство объекта (класса) A, во втором случае вы добавили это свойство в уже готовый объект (класс).
При создании своих объектов (классов), обычно, прозрачнее использовать первый способ.
«prototype» же удобнее, когда вы дополняете уже существующий объект (класс).
Ответ написан
Комментировать
creage
@creage
Прототип задает значение свойства на все объекты класса — это важный момент. Т.е. в первом случае у вас каждый объекта класса А будет иметь сове, личное свойство b, во втором же все объекты класса А имеют одно, общее свойство b.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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