函数中的prototype属性 1. 函数中prototype属性的值是一个对象或null,默认只有一个constructor属性指向函数本身。 2. 当使用new Func()创建一个对象时,使用诸如 new F() 这样的构造函数来创建一个新对象。如果 F.prototype 是一个对象,那么 new 操作符会使用它为新对象设置 [[Prototype]]。 3. prototype和[[Prototype]]不同: - [[Prototype]] 是一个对象的隐藏属性,本质是一个指针,保存的是内存地址,指向对象的原型。 - prototype是一个函数中的属性,本质是一个对象或null。 4. 实例对象通过原型链可以找到Func.prototype上的constructor属性 即new Func().constructor = Func = Func.prototype
function User(name){ this.name = name } User.prototype = {} const u1 = new User('zhangsan') const u2 = new u1.constructor('lisi') console.log(u2.name)
1. 找u1.constructor时,先在u1自身找,u1中没有constructor,则通过[[Prototype]]顺着原型找; 2. 原型是一个空的对象,里面也没有,再顺着原型链找,它的原型是Object.prototype,在此原型中有constructor,指向的是Object构造函数。 3. 则 const u2 = new u1.constructor('lisi');相当于 const u2 = new Object('lisi'); 4. 创建出的u2中没有name属性,所以显示undefined
![](/i/l/?n=22&i=blog/1950675/202210/1950675-20221027201807690-1292931987.png)
![](/i/l/?n=22&i=blog/1950675/202210/1950675-20221027203106282-746888075.png)