方法在现代浏览器中返回 __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 已被建议从浏览器中删除,你不应该直接在代码中使用它,因为未来的浏览器更新可能会完全删除它,然后你的代码就会崩溃有了这些更新。
这是一个返回简单对象的纯方法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:是
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 已被建议从浏览器中删除,你不应该直接在代码中使用它,因为未来的浏览器更新可能会完全删除它,然后你的代码就会崩溃有了这些更新。