JavaScript中function.constructor与prototype.constructor区别及常见疑问解答
你的基础认知是正确的:JavaScript 中普通函数默认自带 prototype 对象属性,该对象的 constructor 属性默认指向函数本身,因此 person.prototype.constructor === person 的判断完全成立。
疑问1解答
person 本身是一个函数类型的对象,在 JavaScript 中,所有函数都是内置构造函数 Function 的实例。对象的 constructor 属性默认会沿自身隐式原型链(__proto__)向上查找:person 的隐式原型指向 Function.prototype,而 Function.prototype.constructor 就是内置的 Function 构造函数,因此 person.constructor 输出的就是原生实现的 Function 函数代码。
疑问2解答
new person.constructor('third') 本质是执行 new Function('third')。Function 构造函数的参数规则是:最后一个参数为新函数的函数体,前面的参数为新函数的入参。你传入的 'third' 会被当作新函数的函数体,因此最终得到的 obj3 是一个新创建的函数,而非 person 的实例,自然不符合预期。你可以打印 typeof obj3 验证,结果会是 function,而非 object。
疑问3解答
两者的核心区别如下:
person.prototype.constructor:是挂载在person显式原型对象上的默认自有属性,设计目的是标记该原型对应的构造函数,和person完全等价,调用它实例化得到的就是person的实例。person.constructor:是person作为Function的实例,从自身隐式原型链继承来的属性,指向的是Function,作用是标记person这个函数对象本身的构造来源,和person要生成的实例没有任何关联。
内容的提问来源于stack exchange,提问作者Rishabh Agrawal
相关产品推荐
相关产品推荐

