В чем разница между this.function и прототипом.функция?

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

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

функция, определенная для этого:

//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);

person Joseph Gabriel    schedule 27.03.2013    source источник


Ответы (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"]
person Ben McCormick    schedule 27.03.2013