Задать вопрос
HamSter007
@HamSter007
HTML/CSS верстальщик

В чем отличие методов объекта?

jsbin

Есть такой простой пример:
// 1. Prototype

               // базовая ф-ия-конст-ор
    function Rectangle(w,h){
			this.w = w;
			this.h = h;
            
        this.getArea = function () {
			    return this.w*this.h;
		    }
		}

		Rectangle.prototype.getArea = function () {
			return this.w*this.h;
		}

		var 
			rect1 = new Rectangle(10,20),
			rect2 = new Rectangle(5,20);


		var 
			area = rect1.getArea(),
       area2 = rect2.getArea();

	    console.log(area);
        console.log(area2);


Пытаюсь разобраться в js, дошла до прототипов, но не могу понять некоторые моменты.

Какая разница в методах

this.getArea = function () {
    return this.w*this.h;
}


и

Rectangle.prototype.getArea = function () {
    return this.w*this.h;
}


Выполняются и так, и так и для всех экземпляров при любой записи, так как правильнее все же писать (через публичный метод ... this.Method ... или через прототип)?

Где вообще можно применить прототипы, для чего их создавать?
  • Вопрос задан
  • 315 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
При объявлении методов внутри конструктора на каждый экземпляр будет создаваться новая функция-метод - будет жрать память, да и конструктор будет работать медленнее (обычно не заметно) + такие методы нельзя будет унаследовать не вызвав конструктор.
При объявлении метода через прототип у Вас будет 1 функция на все экземпляры, включая те, что отнаследовались от Вас, наследоваться можно будет без вызова конструктора + методы не будут собственными для экземпляра, что снизит кол-во ошибок
Так что правильно через прототип
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@GreatRash
В случае прототипов все объекты делят между собой один метод:

var Class = function() {};

Class.prototype.hello = function() {
  alert('hello');
};

var object_1 = new Class();
var object_2 = new Class();

object_1.hello(); // hello
object_2.hello(); // hello

Class.prototype.hello = function() {
  alert('привет');
};

object_1.hello(); // привет
object_2.hello(); // привет

В случае this, методы у каждого объекта будут свои.
Ответ написан
Ваш ответ на вопрос

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

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