JS原型疑问:为何myObj.name输出函数名而非原型属性值?
为什么
myObj.name输出函数名称而非原型上的属性? 先看你给出的代码:
const myObj = function () {} myObj.prototype.name = 'prototype.name' myObj1 = new myObj() console.log(myObj.name) // => myObj console.log(myObj1.name) // => 'prototype.name' console.log(myObj.prototype.name) // => prototype.name
核心原因:函数自身自带name属性
myObj是一个函数对象,JavaScript里所有函数都会自动拥有一个自身的name属性,用来存储函数的定义名称。你用const myObj = function () {}定义函数时,这个函数的名称就被设置为myObj,所以直接访问myObj.name时,取到的是函数自身的属性,不会触发原型链查找。
实例myObj1的行为差异原因
myObj1是通过new myObj()创建的实例对象,它自身没有定义name属性,所以会沿着原型链向上查找:
- 先检查
myObj1自身,没有name属性; - 接着查找它的原型对象
myObj.prototype,这里定义了name: 'prototype.name',因此返回这个值。
别混淆两个原型概念
需要明确区分:
myObj.prototype:这是给myObj的实例用的原型对象,只有实例的原型链会指向这里;- 函数
myObj自身的原型链:函数作为对象,它的原型是Function.prototype,但因为myObj自身已经有name属性,所以不会去Function.prototype上查找,更不会关联到myObj.prototype。
内容的提问来源于stack exchange,提问作者Zwei Wang
相关产品推荐
相关产品推荐

