Задать вопрос

Когда call vs apply vs prototype?

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

Есть:
function A(type){
this.type = type;
this.x = 10;
};
A.prototype.getType = function(){return this.type};
A.prototype.getX = function(){return this.x};

Наследуем:
1. вариант: // Наследуем класс А используя prototype
function B(type){};
B.prototype = new A();
var b = new B('cool');
b.x // 10;
b.type // undefined;

2. вариант: // байндим this класс А, работает все хорошо.
function C(type){
A.call(this, type);
};
var c = new C("cool");
c.x // 10;
c.type // cool


В чем разница этих двух вариантов, когда каждый их них необходимо использовать? Как правильно поступить в первом варианте, чтоб тип принял аргумент? Заранее большое спасибо.
  • Вопрос задан
  • 281 просмотр
Подписаться 5 Оценить 2 комментария
Решения вопроса 1
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
function B(type){};
B.prototype = new A(); //Ставим В в прототип объект, созданный через A, type для которого не указан
var b = new B('cool'); //Создаем объект через B, прототипом для которого станет объект, созданный выше. Указываем "cool" просто так, не для чего.
b.x // 10 - назначеное A
b.type // undefined; - т.к, вызывали new A(), а не new A('cool')

function C(type){
    A.call(this, type); 
    //При вызове С через new создается новый объект (this),
    //A назначает ему свойства x и type, но не ставит __proto__, так как не вызвана через New
};
var c = new C("cool"); 
c.x // 10;
c.type // cool


Ну и, собственное, истинно верный вариант:
//Или если приспичит все же поставить результат new A в прототип:
var b = Object.create(new A());
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы