Какие методы можно использовать для определения класса в JavaScript, и каковы их компромиссы?

Чтобы обновить ответ, вот обновленный командный файл. Обратите внимание на исключение пробела после имени пользователя и пароля (при прохождении пробела на ftp-сайт). Это также будет использовать аргумент, переданный пакетному файлу.

echo open ftp.myserver.com>ftp.txt
echo username>>ftp.txt
echo password>>ftp.txt
echo put %1>>ftp.txt
echo quit>>ftp.txt
ftp -s:ftp.txt
682
задан Daniel X Moore 19 March 2015 в 19:36
поделиться

9 ответов

Вот способ сделать это, не пользуясь никакими внешними библиотеками:

// Define a class like this
function Person(name, gender){

   // Add object properties like this
   this.name = name;
   this.gender = gender;
}

// Add methods like this.  All Person objects will be able to invoke this
Person.prototype.speak = function(){
    alert("Howdy, my name is" + this.name);
};

// Instantiate new objects with 'new'
var person = new Person("Bob", "M");

// Invoke methods like this
person.speak(); // alerts "Howdy, my name is Bob"

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

, Кроме того, существуют многочисленные популярные библиотеки JavaScript, которые имеют их собственный стиль приближения подобной классу функциональности в JavaScript. Вы захотите проверить [по крайней мере 112] Прототип и jQuery.

Решение, которое из них является "лучшим", является отличным способом запустить священную войну на Stack  Переполнение. При осуществлении большего тяжелого JavaScript проекта определенно стоит изучить популярную библиотеку и сделать его их путь. Я - парень Прототипа, но Stack  Переполнение, кажется, склоняется к jQuery.

До того, чтобы там быть только "один способ сделать это", без любых зависимостей от внешних библиотек, способ, которым я записал, является в значительной степени им.

736
ответ дан Triptych 19 March 2015 в 19:36
поделиться

JavaScript объектно-ориентирован , но это радикально отличается, чем другой ООП языки как Java, C# или C++. Не пытайтесь понять его как этот. Выведите то старое знание и запуститесь снова. JavaScript нужны различные взгляды.

я предложил бы получить хорошее руководство или что-то на предмете. я сам нашел Учебные руководства ExtJS лучшее для меня, хотя я не использовал платформу прежде или после чтения его. Но это действительно дает хорошее объяснение о том, что что в мире JavaScript. Извините, кажется, что то содержание было удалено. Вот ссылка на копия archive.org вместо этого. Работы сегодня.: P

0
ответ дан Peter Mortensen 19 March 2015 в 19:36
поделиться

Простой путь:

function Foo(a) {
  var that=this;

  function privateMethod() { .. }

  // public methods
  that.add = function(b) {
    return a + b;
  };
  that.avg = function(b) {
    return that.add(b) / 2; // calling another public method
  };
}

var x = new Foo(10);
alert(x.add(2)); // 12
alert(x.avg(20)); // 15

причина that состоит в том, что this может быть связан с чем-то еще, если Вы даете метод как обработчик событий, таким образом, Вы сохраняете значение во время инстанцирования и используете его позже.

Редактирование: это - определенно не лучший способ, просто простой путь. Я ожидаю хороших ответов также!

10
ответ дан orip 19 March 2015 в 19:36
поделиться

Если Вы идете для простого, можно избежать "нового" ключевого слова полностью и просто использовать методы фабрики. Я предпочитаю это, иногда, потому что мне нравится использовать JSON для создания объектов.

function getSomeObj(var1, var2){
  var obj = {
     instancevar1: var1,
     instancevar2: var2,
     someMethod: function(param)
     {  
          //stuff; 
     }
  };
  return obj;
}

var myobj = getSomeObj("var1", "var2");
myobj.someMethod("bla");

я не уверен, что хит производительности для больших объектов, все же.

15
ответ дан Hearaman 19 March 2015 в 19:36
поделиться

Поскольку я не допущу план фабрики YUI/Crockford и потому что мне нравится сохранять вещи сам содержавшими и расширяемыми, это - мое изменение:

function Person(params)
{
  this.name = params.name || defaultnamevalue;
  this.role = params.role || defaultrolevalue;

  if(typeof(this.speak)=='undefined') //guarantees one time prototyping
  {
    Person.prototype.speak = function() {/* do whatever */};
  }
}

var Robert = new Person({name:'Bob'});

то, где идеально тест typeof находится на чем-то как первый метод, моделировало

16
ответ дан annakata 19 March 2015 в 19:36
поделиться
  • 1
    Что делает предложение CVS это SVN doesn' t? I' ve слышали этот аргумент прежде и должны все же услышать убедительный аргумент в пользу CVS. – Ian P 11 February 2009 в 02:14

Я думаю, что необходимо считать Douglas Crockford Наследование Prototypal в JavaScript и Классическое Наследование в JavaScript.

Примеры от его страницы:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Эффект? Это позволит Вам добавлять методы более изящным способом:

function Parenizor(value) {
    this.setValue(value);
}

Parenizor.method('setValue', function (value) {
    this.value = value;
    return this;
});

я также рекомендую его видео: Усовершенствованный JavaScript.

можно найти больше видео на его странице: http://javascript.crockford.com/ В книге John Reisig можно найти много примеров от веб-сайта Douglas Crockfor.

24
ответ дан Jarek 19 March 2015 в 19:36
поделиться
  • 1
    It' s " simple" потому что it' s настолько старый. Однако современные системы пакета делают почти что-либо еще столь же простое, возможно, moreso. – staticsan 11 February 2009 в 02:40

Лучший способ определить класс в JavaScript не состоит в том, чтобы определить класс.

Серьезно.

существует несколько различных разновидностей объектной ориентации, некоторые из них:

  • основанное на классах OO (сначала представленный Smalltalk)
  • основанное на прототипе OO (сначала представленный Сам)
  • основанное на мультиметоде OO (сначала представленный CommonLoops, я думаю)
  • основанное на предикате OO (никакая идея)

И вероятно другие я не знаю о.

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

, Другими словами: нет никаких классов.

JavaScript на самом деле имеет хорошую тонкую настройку той модели: конструкторы. Мало того, что можно создать объекты путем копирования существующих, можно также создать их "из ничего", так сказать. Если Вы вызываете функцию с new ключевое слово, та функция становится конструктором и this, ключевое слово не укажет на текущий объект, но вместо этого на недавно созданный "пустой". Так, можно настроить объект любым путем, Вам нравится. Таким образом конструкторы JavaScript могут взять на себя одну из ролей классов в традиционном основанном на классах OO: служение в качестве шаблона или проекта новых объектов.

Теперь, JavaScript является очень мощным языком, таким образом, довольно легко реализовать основанную на классах систему OO в JavaScript, если Вы хотите. Однако необходимо только сделать это, если у Вас действительно есть потребность в нем и не только, потому что это - способ, которым Java делает это.

212
ответ дан Jörg W Mittag 19 March 2015 в 19:36
поделиться

MooTools (Мои объектно-ориентированные инструменты) основан на идее классов . Вы даже можете расширить и реализовать с помощью наследования.

После освоения он дает до смешного многоразовый мощный javascript.

2
ответ дан 22 November 2019 в 21:40
поделиться
var Animal = function(options) {
    var name = options.name;
    var animal = {};

    animal.getName = function() {
        return name;
    };

    var somePrivateMethod = function() {

    };

    return animal;
};

// usage
var cat = Animal({name: 'tiger'});
41
ответ дан 22 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

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