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

StackOverflow https://stackoverflow.com/questions/6499

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

У Дугласа Крокфорда хороший Краткие сведения.

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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';
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top