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

Какой стиль вы используете для создания "класса"?

Есть несколько способов получить поведение класса в 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 + ...); }
}

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

4b9b3361

Ответ 1

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

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

Дуглас Крокфорд имеет хороший отчет.

Ответ 2

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Я большой поклонник использования John Resig library для этого. Легкий, прямолинейный, и вы уже знаете, как его использовать, если вы знакомы с "обычным" объектно-ориентированным стилем.

Ответ 7

В javascript нет классов.

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

var james = new Person();

Вы можете моделировать поведение класса подобно:

Пример прототипа

:

function Car (type) {
    this.type = type;
    this.color = "red";
}

Car.prototype.getInfo = function() {
    return this.color + ' ' + this.type + ' car';
};

объект литерал пример

var car = {
    type: "honda",
    color: "red",
    getInfo: function () {
        return this.color + ' ' + this.type + ' car';
    }
}