I am currently learning JavaScript on javascript.info and I came across this statement: Statement Link to the statement: statement
But when I try this code with null in .prototype of constructor:

function Rabbit() {
    this.name = 'rabbit';
}

Rabbit.prototype = null; // *

let obj = new Rabbit();

console.log(Object.getPrototypeOf(obj)); // [Object: null prototype] {}

举个例子,我得了Object.prototype分,而不是null分.
实际上,如果不是Object,它对每个值都有效,例如,这里的[[Prototype]]of obj也是Object.prototype:

function Rabbit() {
    this.name = 'rabbit';
}

Rabbit.prototype = 5; // *

let obj = new Rabbit();

console.log(Object.getPrototypeOf(obj)); // [Object: null prototype] {}

当我有对象.prototype时,它就会正常工作:

function Rabbit() {
    this.name = 'rabbit';
}

Rabbit.prototype = {
    eats: true,
}; // *

let obj = new Rabbit();

console.log(Object.getPrototypeOf(obj)); // { eats: true }

那么,为什么会是这样呢?我是不是搞错了,不明白什么?

推荐答案

如果将任何不是对象的值赋给函数的prototype属性,则将该函数作为构造函数(具有关键字new)调用而创建的对象将获得Object.prototype作为其原型.

MDN - Function: prototype:

如果函数的原型被重新分配给对象以外的其他对象,则当使用new调用该函数时,返回的对象的原型将改为对象原型.(换句话说,new忽略Prototype属性并构造一个普通对象.)

如果你想确保新创建的对象不会从Object.prototype继承任何东西,你可以使用Object.create,如下所示:

Rabbit.prototype = Object.create(null);

这将使原型从Rabbit.prototype变为null.

Javascript相关问答推荐

当promise 在拒绝处理程序被锁定之前被拒绝时,为什么我们会得到未捕获的错误?

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

React Code不在装载上渲染数据,但在渲染上工作

为什么当我解析一个promise时,输出处于挂起状态?

从Node JS将对象数组中的数据插入Postgres表

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

如何发送从REST Api收到的PNG数据响应

DOM不自动更新,尽管运行倒计时TS,JS

如何使用JS创建一个明暗功能按钮?

邮箱密码重置链接不适用于已部署的React应用程序

无法避免UV:flat的插值:非法使用保留字"

Phaserjs-创建带有层纹理的精灵层以自定义外观

用于测试其方法和构造函数的导出/导入类

Next.js无法从外部本地主机获取图像

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

Reaction即使在重新呈现后也会在方法内部保留局部值

是否设置以JavaScript为背景的画布元素?

如何调整下拉内容,使其不与其他元素重叠?

使用导航时,路径的所有子组件都必须是路径

如何在不获取其子元素的文本内容的情况下获取元素的文本内容?