Подтвердить что ты не робот

Какая разница между этой функцией и прототипом?

Учитывая простое наследование JS, какова практическая разница в базовой функции между этими двумя примерами? Другими словами, когда человек должен выбрать функцию "this" вместо прототипа (или наоборот)?

Для меня второй пример легче переварить, но сколько еще есть для этого?

определенная на этом:

//base
var _base = function () {
    this.baseFunction = function () {
        console.log("Hello from base function");
    }
};
//inherit from base
function _ctor() {
    this.property1 = "my property value";
};
_ctor.prototype = new _base();
_ctor.prototype.constructor = _ctor;
//get an instance
var instance = new _ctor();
console.log(instance.baseFunction);

определенная на прототипе:

//base
var _base = function () {};
_base.prototype.baseFunction = function () {
    console.log("Hello from base function");
}
//inherit from base
function _ctor() {
    this.property1 = "my property value";
};
_ctor.prototype = new _base();
_ctor.prototype.constructor = _ctor;
//get an instance
var instance = new _ctor();
console.log(instance.baseFunction);
4b9b3361

Ответ 1

Функции прототипа создаются только один раз и разделяются между каждым экземпляром. Функции, созданные в конструкторе, создаются как новые объекты для каждого нового объекта, созданного с помощью конструктора.

Как правило, функции должны быть на прототипе, поскольку они, как правило, не будут изменены для разных объектов одного и того же типа, и это имеет небольшую выгоду от памяти/производительности. Другие свойства, такие как объекты и массивы, должны быть определены в конструкторе, если вы не хотите создавать общее статическое свойство, и в этом случае вы должны использовать прототип.

Легче видеть различия с обычными объектами или массивами, а не функциями

function Foo(){
    this.bar = [];
}
var fooObj1 = new Foo();
var fooObj2 = new Foo();

fooObj1.bar.push("x");
alert(fooObj2.bar) //[]

в отличие от:

function Foo(){
}

Foo.prototype.bar = []
var fooObj1 = new Foo();
var fooObj2 = new Foo();

fooObj1.bar.push("x");
alert(fooObj2.bar) //["x"]