主题
原型
什么是原型?
原型(Prototype) 是 JavaScript 实现继承和共享属性 的机制。每个对象都有一个 原型对象,对象可以从原型继承属性和方法。
__proto__(隐式原型):JavaScript 每个对象 都有一个__proto__属性(非标准,浏览器环境可访问),它指向 创建该对象的构造函数的prototype。jsconst obj = {} console.log(obj.__proto__ === Object.prototype) // ✅ trueprototype(显式原型):只有 函数(Function) 才有prototype属性。prototype是构造函数的原型对象,其中定义的属性和方法会被所有实例继承。jsfunction Person(name) { this.name = name } console.log(Person.prototype) // ✅ Person 的 prototype 对象prototype属性是一个对象,默认情况下这个prototype对象有一个constructor属性,指向这个函数本身。
什么是原型链?
JavaScript 对象的属性查找 遵循 原型链(Prototype Chain)。
基本查找规则:
- 访问对象属性时,先查找对象本身;
- 如果找不到,会沿着
__proto__向上查找 原型对象,直到Object.prototype。 - 如果
Object.prototype也找不到,则返回undefined。
js
function Person(name) {
this.name = name
}
Person.prototype.sayHello = function () {
console.log('Hello')
}
const p = new Person('Tom')
console.log(p.name) // ✅ Tom(实例自身属性)
console.log(p.sayHello) // ✅ sayHello 方法,来自 `Person.prototype`
console.log(p.toString) // ✅ 来自 `Object.prototype`
console.log(p.__proto__.__proto__ === Object.prototype) // ✅ true
console.log(Object.prototype.__proto__) // ✅ null(原型链终点)延申
A instanceof B,判断的是?
在 A 的原型链上去找 B 的原型(B.prototype)
...
for...in循环可以遍历对象自身以及其原型链上的可枚举属性。Object.assign(obj1, obj2)可以实现对象的浅拷贝。Object.keys(obj)得到的是对象自身的可枚举属性。
