Метод возвращает __proto__ в современном браузере?Как это убрать? - PullRequest
0 голосов
/ 29 декабря 2018

Это метод чистого 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 ]

0 голосов
/ 29 декабря 2018

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

0 голосов
/ 29 декабря 2018

Почему [это показывает] __proto__?

Цепочка прототипов очень важна, если вы хотите понять, почему объект ведет себя определенным образом.Является ли оно отображаемым как __proto__ или [[Prototype]] или <prototype> на самом деле не имеет значения, не так ли?...

Как отключить эту уродливую [визуализацию объектов]?

Использовать другой браузер, если вас это действительно беспокоит.

с любопытствомMyClass.retObj (). X [кажется, не имеет] __proto__.

Это действительно забавно, вероятно, консоль считает, что Prototype не имеет отношения к аудитории, поэтому скрывает его,однако это не совсем в обоих случаях.Однако, с другой стороны, это динамическое поведение визуализации вещей является своего рода ошибкой, поскольку можно подумать, что __proto__ существует не на одном объекте, а на другом (он существует на обоих).

MDN говорит, что [__proto__] «больше не рекомендуется».Как отключить это уродливое свойство [__proto__]?

И я бы не рекомендовал использовать var, обратная совместимость уродлива, но обязательна.Удаление всех этих плохих дизайнерских решений «сломало бы интернет», поэтому их сохранение определенно лучше.

Но нет ли проблем?

Да, __proto__ проблематично для оптимизации производительности, но ... это JavaScript, браузеры знают, как оптимизировать неопределенность.

, возвращая объект, который являетсяне то, что я определил?

Вы также не определили {}.toString().Если вам действительно нужен полностью пустой объект, используйте

 Object.create(null)

, чтобы заставить моего пользователя употреблять столько мусора?

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

Нет чистого JSON?

 JSON.stringify({}) // {} ?!?
...