this.method = function () {} VS obj.prototype.method = function () {} - PullRequest
3 голосов
/ 03 августа 2011

Как ac # /. Net dev, в свободное время я люблю играть с JavaScript, создавая свои собственные библиотеки / фреймворки и тому подобное.По общему признанию, они не много (на самом деле не более, чем просто набор функций), но цель состоит в том, чтобы научиться;не для использования другими людьми.

Я обычно расширяю базовый объект JavaScript таким образом

obj = function () {
    //basic object stuff
    this.method = function () {
        //other stuff
    };
    return this;
};

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

obj('arg1').method();

Два примера: jQuery Knock-off , Сортировщик элементов списка

Однако недавно я видел, что гораздо больше кода функции, чеммои собственные объекты выполняют одну и ту же функциональность следующим образом:

function obj(){
    //stuff
}
obj.prototype.method = function () {
    //stuff
};

Пример: Расширение Reddit Chrome

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

Редактировать

Рассмотрим следующий код:

var dice = function (sides) {
    this.roll(){
        return 4 //guaranteed to be random
    }
};

var d1 = dice(6);
d1.roll()  // 4;
var d2 = dice(20);
d2.roll()  // 4

Являются ли d1 иd2 разные предметы, как они мне кажутся?Или это указатели / псевдонимы для одного объекта (различные кубики)?

1 Ответ

13 голосов
/ 03 августа 2011
this.method = function(){};

Работает только для этого конкретного экземпляра.

Obj.prototype.method = function(){};

Будет работать для каждого экземпляра Obj

Хотя, чтобы воспользоваться prototype, вы должны сделать

var o = new Obj(); // Note that functions intended to be used with "new" should be capitalized

o.method();

Пример игры в кости

Я предполагаю, что вы намеревались return this в своей функции dice().

Этот пример не очень распространен,потому что вызов функции не создает новый объект .В случае с игрой в кости вы должны назначить метод для this, который внутри функции равен window глобальному объекту, а затем вернуть его.

Результатом будет тот же объект (window)в обоих d1 и d2, с методом roll, который будет переназначен во втором вызове.

Чтобы достичь того, что вы хотите, вы должны создать экземпляры с new, например так:

var d1 = new Dice(6); // remember capitalization is important here
var d2 = new Dice(20); 

Это, однако, создаст 2 roll функций, что правильно, но тратит память, так как функцию можно разделить, выполнив:

Dice.prototype.roll = function() { /* return random awesomeness */ };

Надеюсь, что все прояснит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...