Является ли хорошей практикой создание прототипа JavaScript-метода «равно» для объявлений пользовательских объектов, и если да, то как? - PullRequest
4 голосов
/ 31 августа 2011

Я пытаюсь создать набор повторно используемых объектов в javascript, и некоторые из парадигм управляемой инфраструктуры (например, .NET) не переводятся напрямую.

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

Так что, если я собираюсь заняться созданием определений объектов, как лучше написать прототип функции сравнения?

например. если я начинаю в том же духе, что и ниже, я направляюсь в правильном направлении или готовлюсь к боли позже?

РЕДАКТИРОВАТЬ: поместил код в той же строке, что и возврат в соответствии с предложением комментария

function Car(make, model, colour) {
    this.make = make;
    this.model = model;
    this.colour = colour;
}

Car.prototype.equals = function(otherCar) {
    // Check that 'otherCar' really is a 'Car' ?
    // otherwise the property comparison code below with throw an exception, right?
    // How?


    // I could just use try / catch, but that could be 'expensive'?

    // Property-for-property comparison


    try {

        return this.make === otherCar.make
            && this.model === otherCar.model
            && this.colour === otherCar.colour;

    } catch(err) {

        return false;

    }
}

1 Ответ

2 голосов
/ 31 августа 2011

Использование try-catch здесь не обязательно. Оператор return в любом случае не генерирует исключение. Просто используйте

    return otherCar !== null &&
        this.make === otherCar.make
        && this.model === otherCar.model
        && this.colour === otherCar.colour;

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

    return typeof otherCar !== 'undefined' &&
        otherCar !== null &&
        this.make === otherCar.make
        && this.model === otherCar.model
        && this.colour === otherCar.colour;

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

EDIT try-catch блок был частично исправлен в вопросе. Добавленные улучшения указаны в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...