Метод возвращает __proto__ в современном браузере? Как это убрать?
Это метод чистого Javascript, возвращающий простой объект,
MyClass.retObj = function() {
return {
x: {a:1, b:this.b}
,y: this.y
};
}
document.addEventListener('DOMContentLoaded', function(){ // ONLOAD:
console.log( MyClass.retObj().x ) // good...
console.log( MyClass.retObj() ) // BAD! show __proto__
}, false); // \ONLOAD
Почему это возвращает __proto__
в современном браузере? Как отключить это безобразное поведение в наши дни (2019)?
MDN говорит, что эта функция "больше не рекомендуется".
PS: это не дубликат этого вопроса, потому что здесь самый простой и прямой контекст, и мне нужен простой ответ... И речь идет о "в наше время".
2 ответа
Почему [это показывает]
__proto__
?
Цепочка прототипов очень важна, если вы хотите понять, почему объект ведет себя определенным образом. Отображается ли оно как __proto__
или же [[Prototype]]
или же <prototype>
не очень актуально, не так ли?...
Как отключить этот некрасивый [визуализация объекта]?
Используйте другой браузер, если это действительно беспокоит вас.
Любопытно, что MyClass.retObj().x [не похоже]
__proto__
,
Это действительно забавно, вероятно, консоль думает, что Прототип не имеет отношения к аудитории, поэтому он скрывает это, однако это не совсем в обоих случаях. С другой стороны, однако, это динамическое поведение визуализации вещей является своего рода ошибкой, поскольку можно подумать, что __proto__
не существует на одном объекте, но на другом (он существует на обоих).
MDN говорит, что [
__proto__
] "больше не рекомендуется". Как отключить этот некрасивый [__proto__
имущество]?
И я бы не рекомендовал использовать var
обратная совместимость некрасива, но обязательна. Удаление всех этих плохих дизайнерских решений "сломало бы интернет", поэтому лучше их сохранить.
Но нет ли проблем?
Да, __proto__
проблематично для оптимизации производительности, но... это JavaScript, браузеры знают, как оптимизировать неопределенность.
вернуть объект, который не является тем, что я определил?
Вы также не определили {}.toString()
, Если вам действительно нужен полностью пустой объект, используйте
Object.create(null)
вынуждает так много мусора для пользователей моего метода?
__proto__
не перечисляется и не наследуется, вы не найдете его случайно программно, если не будете его активно искать.
Нет чистого JSON?
JSON.stringify({}) // {} ?!?
Мой ответ может показаться больше мнением, чем фактом, но я попробую. Ссылочная статья здесь утверждает, что использование __ proto __ не рекомендуется, то есть избегайте непосредственного использования его в своем коде.
То есть не делайте этого:
function Person() {
this.Name = "";
}
Person.prototype.setName = function(name) {
this.Name = name;
};
Person.prototype.getName = function() {
return this.Name;
};
var john = new Person();
console.log( john.__proto__ );
Поскольку proto рекомендуется рекомендовать удалить из браузеров, вы не должны использовать его непосредственно в коде, поскольку будущие обновления браузера могут полностью его удалить, и тогда ваш код порвет с этими обновлениями.