Общие ограничения в Котлине, это просто проблема дисперсии?

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

(function() {
    if ( typeof Object.id == "undefined" ) {
        var id = 0;

        Object.id = function(o) {
            if ( typeof o.__uniqueid == "undefined" ) {
                Object.defineProperty(o, "__uniqueid", {
                    value: ++id,
                    enumerable: false,
                    // This could go either way, depending on your 
                    // interpretation of what an "id" is
                    writable: false
                });
            }

            return o.__uniqueid;
        };
    }
})();

var obj = { a: 1, b: 1 };

console.log(Object.id(obj));
console.log(Object.id([]));
console.log(Object.id({}));
console.log(Object.id(/./));
console.log(Object.id(function() {}));

for (var k in obj) {
    if (obj.hasOwnProperty(k)) {
        console.log(k);
    }
}
// Logged keys are `a` and `b`

Если у вас есть требования к архаичному браузеру, проверьте здесь для совместимости браузеров для Object.defineProperty.

Оригинальный ответ хранится ниже (а не только в истории изменений), потому что я считаю, что сравнение ценно.


Вы можете дать следующее вращение. Это также дает вам возможность явно установить идентификатор объекта в его конструкторе или в другом месте.

(function() {
    if ( typeof Object.prototype.uniqueId == "undefined" ) {
        var id = 0;
        Object.prototype.uniqueId = function() {
            if ( typeof this.__uniqueid == "undefined" ) {
                this.__uniqueid = ++id;
            }
            return this.__uniqueid;
        };
    }
})();

var obj1 = {};
var obj2 = new Object();

console.log(obj1.uniqueId());
console.log(obj2.uniqueId());
console.log([].uniqueId());
console.log({}.uniqueId());
console.log(/./.uniqueId());
console.log((function() {}).uniqueId());

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

1
задан Michal Pawluk 18 January 2019 в 13:18
поделиться

1 ответ

Это известная проблема, вы можете проголосовать за https://youtrack.jetbrains.com/issue/KT-17186

. В качестве обходного пути вам необходимо объявить наследник MyClass, который заменяет все параметры типа. Это позволит решить вашу проблему.

0
ответ дан Eugene Petrenko 18 January 2019 в 13:18
поделиться
Другие вопросы по тегам:

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