Are you an LLM? You can read better optimized documentation at /vite-press/frontend/javascript/prototype.md for this page in Markdown format
原型链
原型对象
JS的每个函数(Person)在创建的时候,都会生成一个prototype属性,这个属性指向一个对象,这个对象就是此函数的原型对象(Person.prototype)。每一个对象(包括普通对象、实例、
prototype)都有一个__proto__属性,这个属性指向该对象的构造函数的原型对象(Person.prototype)。原型对象(
Person.prototype)中有个constructor属性,这个属性指向该构造函数。这样原型对象和它的构造函数之间就产生了联系。

原型链
当我们访问一个 对象 的属性或者方法的时候,会先在对象自身属性上查找,有则直接使用,没有则通过他的隐式属性 person.__proto__(Person.prototype) 上查找,如果没有找到则会在其构造函数的 prototype 的 __proto__ 中查找,没有找到就再往上一层查找,直到 Object,这样一层一层的查找就会形成一个链式结构——原型链

new
new 关键字会进行如下的操作:
创建一个空对象
obj;为
obj添加原型属性__proto__链接构造函数的原型对象;将构造函数的 this 指向
obj;如果构造函数没有返回对象,则返回
obj。
javascript
function myNew(Func: Function, ...args: any[]) {
// 1. 创建一个空对象
const obj = Object.create(null)
// 2. 将构造函数原型对象指向新对象原型
obj.__proto__ = Func.prototype
// 3. 将构造函数的 this 指向新对象,调用构造函数
const result = Func.apply(obj, args)
// 4. 根据返回值判断
return result instanceof Object ? result : obj
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10