为何并非所有函数对象都有prototype属性?我的改写错在哪?
为什么你的改写存在错误?
你的改写主要错在两个核心点,和“可以把prototype设为null”无关:
不是所有function对象都自带prototype属性
比如箭头函数、通过bind()生成的绑定函数,它们都是Function的实例(属于function对象),但默认没有prototype属性。你说“每个function对象默认都有一个prototype属性”,这不符合JS的实际规则。对“初始状态”的表述不够严谨
原表述明确指出constructor是初始时指向原函数对象,而你的改写里只说“该对象拥有一个预定义的[[DontEnum]]属性constructor”,没有强调“初始”这个前提——如果后续手动替换了函数的prototype指向的对象,新对象默认不会自带指向原函数的constructor属性,除非你手动添加。
举个例子验证:
// 箭头函数没有prototype const arrow = () => {}; console.log(arrow.prototype); // undefined // 替换prototype后,新对象没有默认的constructor指向原函数 function Foo() {} Foo.prototype = { bar: 1 }; const foo = new Foo(); console.log(foo.constructor === Foo); // false,此时constructor指向Object
内容的提问来源于stack exchange,提问作者NeoZoom.lua
相关产品推荐
相关产品推荐

