Метод возвращает __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 рекомендуется рекомендовать удалить из браузеров, вы не должны использовать его непосредственно в коде, поскольку будущие обновления браузера могут полностью его удалить, и тогда ваш код порвет с этими обновлениями.

Другие вопросы по тегам