наследование JavaScript

Не используйте старые версии Java.

Что происходит, так это то, что lombok помещает следующую строку в ваш eclipse.ini:

-javaagent: lombok.jar

И lombok.jar находится в каталоге C:\eclipse\jee-oxygen\eclipse

Проблема в том, что ярлык созданная установка Windows выглядит следующим образом:

enter image description here

Заполните путь «Начать с», и он будет работать:

enter image description here

8
задан Marc Gravell 31 May 2009 в 09:01
поделиться

5 ответов

Это не хак как таковой; JavaScript - это прототип языка, как определено в Википедии , где:

.. классы отсутствуют, а повторное использование поведения (известное как наследование в языках, основанных на классах) выполняется посредством процесса клонирования существующих объекты, которые служат прототипами.

Как говорится, классы не используются в JavaScript; каждый создаваемый вами объект происходит от JavaScript Object ; все объекты в JavaScript имеют объект-прототип , и все экземпляры объектов, которые вы создаете, «наследуют» методы и свойства от объекта-прототипа своего объекта. Взгляните на ссылку на объект MDC prototype для получения дополнительной информации.

Начиная с этого момента, когда вы вызываете строку:

CHILDClass.prototype = new PARENTClass();

Это позволяет объекту CHILDClass добавлять методы и свойства к своему объекту-прототипу из объекта PARENTClass , что создает эффект, аналогичный идее наследования, присутствующей в языках на основе классов. . Поскольку объект прототип влияет на каждый экземпляр, созданный для этого объекта, это позволяет методам и свойствам родительского объекта присутствовать в каждом экземпляре вашего дочернего объекта.

Если вы хотите вызвать конструктор родительского класса в конструктор вашего дочернего класса, вы используете функцию JavaScript call ; это позволяет вам вызывать конструктор родительского класса в контексте конструктора дочернего класса, тем самым устанавливая для вновь созданных прототипов свойств в вашем дочернем классе то, что они установлены, как в родительском классе.

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

17
ответ дан 5 December 2019 в 05:34
поделиться

Есть разница, но нет никакой разницы в этом примере.

Использование более подробного метода: new Array () имеет один дополнительный параметр в параметры: если вы передадите число в конструктор, вы получите массив такой длины:

x = new Array(5);
alert(x.length); // 5

Чтобы проиллюстрировать различные способы создания массива:

var a = [],            // these are the same
    b = new Array(),   // a and b are arrays with length 0

    c = ['foo', 'bar'],           // these are the same
    d = new Array('foo', 'bar'),  // c and d are arrays with 2 strings

    // these are different:
    e = [3]             // e.length == 1, e[0] == 3
    f = new Array(3),   // f.length == 3, f[0] == undefined

;

Другое отличие состоит в том, что при использовании new Array () вы можете установить размер массива, который влияет на размер стека. Это может быть полезно, если вы получаете переполнение стека ( Производительность Array.push vs Array.unshift ), что происходит, когда размер массива превышает размер стека, и он должен быть воссоздан. Таким образом, на самом деле, в зависимости от варианта использования, будет повышать производительность при использовании new Array () , потому что вы можете предотвратить переполнение.

Как указано в этот ответ , new Array (5) фактически не добавит в массив пять неопределенных элементов. Он просто добавляет место для пяти предметов. Имейте в виду, что использование Array таким образом затрудняет использование array.length для вычислений.

Приведенный выше пример будет выглядеть так:

var ParentClass = Class.extend({
    constructor: function(baseVar) {
        // do stuff
    },
    a: 'b',
    c: 'd'
});

var ChildClass = ParentClass.extend({
    e: 'f'
});
1
ответ дан 5 December 2019 в 05:34
поделиться

You can manually invoke the parent constructor in the subclass constructor like this:

CHILDClass = function (basevar) {
  PARENTClass.call(this, basevar);
  // do something;
};

The trick here is using the call method, which allows you to invoke a method in the context of a different object. See the documentation of call for more details.

10
ответ дан 5 December 2019 в 05:34
поделиться

У меня есть облегченная оболочка ООП javascript, которая обеспечивает наследование «как у классов», где вы можете переопределить базовые методы или вызвать базовые конструкторы или члены.

Вы определяете свои классы следующим образом:

//Define the 'Cat' class
function Cat(catType, firstName, lastName)
{
    //Call the 'Animal' constructor.
    Cat.$baseNew.call(this, firstName, lastName);

    this.catType = catType;
}
//Extend Animal, and Register the 'Cat' type.
Cat.extend(Animal, { type: 'Cat' }, {
    hello: function(text)
    {
        return "meaoow: " + text;
    },
    getFullName: function()
    {
        //Call the base 'Animal' getFullName method.
        return this.catType + ": " + Cat.$base.getFullName.call(this);
    }
})

//It has a built-in type system that lets you do stuff like:

var cat = new Cat("ginger", "kitty", "kat");
Cat.getType()                     // "Cat"
cat.getBaseTypesAndSelf()         // ["Cat","Animal","Class"]
cat.getType()                     // "Cat"
cat.isTypeOf(Animal.getType())    // "True"

var dynamicCat = Class.createNew("Cat", ["tab","fat","cat"])
dynamicCat.getBaseTypesAndSelf()  // ["Cat","Animal","Class"]
dynamicCat.getFullName()          // tab: fat cat

исходный код доступен по адресу: Class.js

У меня также есть более подробная информация в моем блоге о ООП в javascript

1
ответ дан 5 December 2019 в 05:34
поделиться

Просто подумал, что упомяну некоторые проблемы с классическим шаблоном, который вы собираемся:

  1. Ссылочные переменные суперкласса (ов) будут доступны как статические во ВСЕХ экземплярах. Например, если у вас есть var arr = [1,2,3] в super и вы выполняете instance_1.arr.push (4) instance_2.arr.push (5), ВСЕ эти экземпляры "увидят" изменения.
  2. Итак, вы решаете 1. с помощью решения Аймана, которое Закас называет «Кража конструктора», но теперь вы вызываете конструктор дважды: один раз для вашего прототипа и один раз для похищения конструктора. Решение - для вашего прототипа используйте помощник, например, inheritPrototype (я показал всю его реализацию в этом посте: метод inheritPrototype FWIW, по сути, это произошло из комбинации страницы 181 книги Закаса и некоторого исследования Крокфорда.

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

  4. Определение объекта осталось «болтающимся»: Решение - поставьте оператор if, проверяющий любую из функций вашего прототипа, а затем определите прототип с литералом прототипа.

У меня есть запущенные примеры всего этого на github !! !

Для меня было не менее сложной задачей по-настоящему ощутить оба: книги Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * книга и некоторые исследования Крокфорда.

  • Никакой конфиденциальности (но опять же, вам нужно будет использовать что-то вроде шаблона Durable Object, чтобы получить это, и это может быть не то, что вам нужно)

  • Определение объекта оставлено "болтающимся" ": Решение - поставьте оператор if, проверяющий любую из функций вашего прототипа, а затем определите прототип с литералом прототипа.
  • У меня есть запущенные примеры всего этого на github !!!

    Это было точно так же Задача для меня по-настоящему ощутить оба: книги Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * книга и некоторые исследования Крокфорда.

  • Никакой конфиденциальности (но опять же, вам нужно будет использовать что-то вроде шаблона Durable Object, чтобы получить это, и это может быть не то, что вам нужно)

  • Определение объекта оставлено "болтающимся" ": Решение - поставьте оператор if, проверяющий любую из функций вашего прототипа, а затем определите прототип с литералом прототипа.
  • У меня есть запущенные примеры всего этого на github !!!

    Это было точно так же Задача для меня по-настоящему ощутить оба: книги Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * d нужно использовать что-то вроде шаблона Durable Object, чтобы получить это, и это может быть не то, что вы хотите)

  • Определение объекта остается «висящим»: Решение - поставьте оператор if, проверяющий любую из функций вашего прототипа, а затем определите прототип с литералом прототипа.
  • У меня есть запущенные примеры всего этого на github !!!

    Для меня было не менее сложной задачей по-настоящему разобраться и в книгах Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * d нужно использовать что-то вроде шаблона Durable Object, чтобы получить это, и это может быть не то, что вы хотите)

  • Определение объекта остается «висящим»: Решение - поставьте оператор if, проверяющий любую из функций вашего прототипа, а затем определите prototype с литералом прототипа.
  • У меня есть запущенные примеры всего этого на github !!!

    Для меня было столь же сложной задачей по-настоящему разобраться и в книгах Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * Решение - поставьте проверку оператора if для любой из функций вашего прототипа, а затем определите прототип с литералом прототипа.

    У меня есть запущенные примеры всего этого на github !!!

    Это было не менее сложной задачей Мне нужно по-настоящему взглянуть на книги Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * Решение - поставьте проверку оператора if для любой из функций вашего прототипа, а затем определите прототип с литералом прототипа.

    У меня есть запущенные примеры всего этого на github !!!

    Это было не менее сложной задачей Мне нужно по-настоящему взглянуть на книги Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * Книги Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * Книги Закаса и Крокфорда по созданию и наследованию объектов. Мне также нужно было попробовать несколько различных фреймворков JavaScript TDD. Поэтому я решил написать эссе по TDD Frameworks и JavaScript Object Creation & Inheritance. Имеет работающий код и тесты jspec! Вот ссылка: * Мое эссе / книга с открытым исходным кодом на GitHub

    1
    ответ дан 5 December 2019 в 05:34
    поделиться
    Другие вопросы по тегам:

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