Какой стиль Вы используете для создания “класса”?

Существует несколько способов получить подобное классу поведение в JavaScript, наиболее распространенные, кажется, прототип, базирующийся как это:

function Vector(x, y, x) {
    this.x = x;
    this.y = y;
    this.z = z;
    return this;
}

Vector.prototype.length = function () { return Math.sqrt(this.x * this.x ... ); }

и основанные на закрытии подходы, подобные

function Vector(x, y, z) {
    this.length = function() { return Math.sqrt(x * x + ...); }
}

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

19
задан Lee Taylor 27 January 2013 в 14:09
поделиться

5 ответов

Присвоение функций к прототипу лучше (для открытых методов), потому что все экземпляры класса совместно используют ту же копию метода. При присвоении функции в конструкторе как во втором примере каждый раз, когда Вы создаете новый экземпляр, конструктор создает новую копию функции длины и присваивает ее просто что один экземпляр.

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

у Douglas Crockford есть польза сводка .

10
ответ дан 30 November 2019 в 04:33
поделиться

Существует также подход литерала объектов к прототипу:

var Vector = function(){};

Vector.prototype = {
  init:function(x,y,z) {
    this.x = x;
    this.y = y;
    this.z = z;
  },
  length:function() {
    return Math.sqrt(x * x + ...);
  }
};

var v1 = new Vector();
v1.init(1,2,3);
5
ответ дан 30 November 2019 в 04:33
поделиться

К счастью, я добираюсь для использования prototype.js, который обеспечивает некоторые хорошие обертки. Таким образом, можно сделать это:

var Person = Class.create({
    initialize: function(name) {
        this.name = name;
    },
    say: function(message) {
        return this.name + ': ' + message;
    }
});

Prototype.js Документация: Определение классов и наследования

3
ответ дан 30 November 2019 в 04:33
поделиться

Ну, у меня действительно нет мнения эксперта об этом. Я обычно заканчиваю тем, что использовал основанный на закрытиях подход просто, потому что это сохраняет код более простым менеджеру. Но, я использовал прототипы для методов, которые имеют загрузки строк кода.

2
ответ дан 30 November 2019 в 04:33
поделиться

У Вас также есть выбор:

function Vector(x, y, z) {
  function length() {
    return Math.sqrt(x * x + ...);
  }
}

, Который является, вероятно, столь же медленным как пример два, но это смотрит больше как Java/C# и немного более явно.

2
ответ дан 30 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

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