为什么刷新浏览器前后控制台.log的结果会有所不同?



我有这样的代码片段:

function Person(myName,myAge) {
this.name = myName
this.age = myAge
}
Person.prototype = {
say:function() {
console.log("Hi");
}
}
let person = new Person("John",12);
console.log(Person.prototype)
console.log(Person.prototype.constructor)
console.log(person.__proto__)

我不明白为什么当我第一次执行代码时(通过右键单击并在 chrome 中打开文件(,devtool 会记录:

Object
ƒ Object() { [native code] }
Object

但是当我刷新浏览器时,开发工具将记录:

{say: ƒ}
ƒ Object() { [native code] }
{say: ƒ}

所以,在第一个日志中,它实际上没有记录完整的对象,对吧?它只是记录Object以告诉您它是一个对象,而不是告诉您该对象的内容。为什么?浏览器刷新时会做什么?

直接更改原型不是一个好主意。无论您使用setPrototypeOf还是直接.prototype.

来自 MDN

警告:根据现代 JavaScript 引擎优化属性访问的本质,更改对象的 [[Prototype]] 是目前每个浏览器和 JavaScript 引擎中非常缓慢的操作。此外,更改继承的影响是微妙而深远的,并且不仅限于在 Object.setPrototypeOf(...( 语句中花费的时间,而是可以扩展到有权访问其 [[Prototype]] 已被更改的任何对象的任何代码。

因为这个功能是语言的一部分,所以它仍然是负担 引擎开发人员以高性能(理想情况下(实现该功能。 在引擎开发人员解决此问题之前,如果您担心 性能,则应避免设置对象的[[原型]]。 相反,使用 Object.create((.

您应该将 Object.create 与所需的原型一起使用。

最新更新