Подклассы из (расширения) элемента HTML?

Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.

В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.

Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:

if (string1.equals(string2))

Этот метод String равен методу для двух строк Java, и если они содержат точно такую ​​же строку символов, они считаются равными.

Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Вариант 2: Сравнение строк с методом equalsIgnoreCase

В некоторых строковых сравнительных тестах вы захотите игнорируйте, являются ли строки строчными или строчными. Если вы хотите проверить свои строки на равенство в этом случае нечувствительным образом, используйте метод equalsIgnoreCase класса String, например:

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

Вариант 3: сравнение строк Java с методом compareTo

Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).

Вы можете посмотреть на это ==, .equals (), compareTo () и compare ()

7
задан Aseem Kishore 6 September 2009 в 00:12
поделиться

2 ответа

Это может вам помочь. В этой игре на основе Javascript он расширил элементы table в DOM. MiniRacer на CodeProject .

И я считаю, что он получил свою технику из этой статьи Пола Соудена .

2
ответ дан 6 December 2019 в 23:11
поделиться

Я не могу понять, что вызывать в конструкторе

Image2.prototype.constructor.call (this);

Да, объекты JavaScript не есть такие классы и цепные конструкторы. У него есть собственная модель прототипов, которая может сбивать с толку, но не t на самом деле обеспечивает надлежащий потенциал наследования прототипов, потому что он все еще привязан к функциям-конструкторам, которые выглядят как конструкторы классов, но на самом деле не являются.

к сожалению, на самом деле это не создает подкласс; это просто замаскированное расширение экземпляров

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

Например, в вашем «стандартном» коде вы говорите:

ClassA.call (this, foo);

, но это работает только потому, что вы написали ClassA таким образом, что вы можете дважды вызвать его, один раз для прототипа ClassA с 'foo', установленным в 'undefined', а затем еще раз для объекта, который наследуется от этого прототипа, чтобы замаскировать этот 'foo' за другим 'foo' поверх.

Это не что-то на самом деле стандарт, который классы, как ожидается, будут делать друг для друга, и, конечно же, не указано, что это будет работать для объектов браузера, не относящихся к JS:

function MyImage() {
    Image.call(this); // might do anything. will almost certainly fail
}
MyImage.prototype= new Image();

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

Кроме того,

Image2.prototype.constructor

из вашего примера может на самом деле не совпадать с 'Image', как вы ожидать. 'конструктор', помимо того, что является нестандартным свойством, доступным не во всех браузерах, он делает что-то, что в системе классов было бы совсем не тем, о чем вы думаете; его лучше избегать.

Image2 должен иметь все свойства / методы Image и многое другое

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

function makeImage2() {
    var image= Image();
    image.isBig= function() {
        return this.width>200 || this.height>200;
    };
}

это, конечно, всего лишь заводская функция, а не что-то вроде создания подклассов. Вам придется предоставить свою собственную замену для instanceof.

...

// An example class system
//
Function.prototype.subclass= function() {
    var c= new Function(
        'if (!(this instanceof arguments.callee)) throw(\'Constructor called without "new"\'); '+
        'if (arguments[0]!==Function.prototype.subclass._FLAG && this._init) this._init.apply(this, arguments); '
    );
    if (this!==Object)
        c.prototype= new this(Function.prototype.subclass._FLAG);
    return c;
};
Function.prototype.subclass._FLAG= {};

// Usage
//
ClassA= Object.subclass();
ClassA.prototype._init= function(foo) {
    this.foo= foo;
};
ClassA.prototype.toString= function() {
    return 'My foo is '+this.foo;
};

ClassB= ClassA.subclass();
ClassB.prototype._init= function(foo, bar) {
    ClassA.prototype._init.call(this, foo);
    this.bar= bar;
};
ClassB.prototype.toString= function() {
    return ClassA.prototype.toString.call(this)+' and my bar is '+this.bar;
};
3
ответ дан 6 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

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