方法在现代浏览器中返回 __proto__?如何删除它?

Method is returning __proto__ in a modern browser? How to remove it?

这是一个返回简单对象的纯方法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

为什么在现代浏览器中 returns 是 __proto__如今(2019 年)如何禁用这种丑陋的行为

MDN 说 this feature "is no longer recommended"


PS:是,因为这里是最简单直接的上下文,我需要一个简单的答案...而且是关于"nowadays".

Why [does it show] a __proto__?

如果你想理解一个对象为什么以某种方式表现,原型链是非常重要的。无论它显示为 __proto__ 还是 [[Prototype]]<prototype> 都不是真正相关的,是吗? ...

How to disable this ugly [object visualization]?

如果这真的让您感到困扰,请使用其他浏览器。

curiously MyClass.retObj().x [does not seem to have] __proto__.

这确实很有趣,可能控制台认为原型与观众无关,因此将其隐藏,但实际上在这两种情况下都不是。然而,另一方面,这种可视化事物的动态行为有点误导,因为人们可能认为 __proto__ 不存在于一个对象上,而是存在于另一个对象上(它确实存在于两个对象上)。

MDN says that [__proto__] "is no longer recommended". How to disable this ugly [__proto__ property]?

而且我不建议使用 var,向后兼容性很丑陋但强制性。删除所有这些糟糕的设计决策会 "break the internet",因此保留它们肯定更好。

But are there no problem[s]?

是的,__proto__对性能优化来说是有问题的,但是……是JavaScript,浏览器知道如何优化不确定。

returning an object that is not what I defined?

您还没有定义{}.toString()。如果你真的需要一个完全空白的对象,使用

 Object.create(null)

forcing the ingestion of so much rubbish for users of my method?

__proto__不是可枚举和继承的,如果你不主动搜索它,你不会通过编程偶然发现它。

No clean JSON?

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

我的回答听起来可能更多的是观点而不是事实,但我会试一试。引用的文章 here 声明不建议使用 __ 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 已被建议从浏览器中删除,你不应该直接在代码中使用它,因为未来的浏览器更新可能会完全删除它,然后你的代码就会崩溃有了这些更新。