什么是JavaScript prototype原型链及其工作原理?

摘要:JavaScript prototype 详解 JavaScript 中,prototype(原型) 是面向对象编程的核心概念之一。它通过 原型链(Prototype Chain) 实现继承,使对象可以共享其他对象的属性和方法。理解原型机制
JavaScript prototype 详解 JavaScript 中,prototype(原型) 是面向对象编程的核心概念之一。它通过 原型链(Prototype Chain) 实现继承,使对象可以共享其他对象的属性和方法。理解原型机制是掌握 JavaScript 面向对象编程的关键。 什么是 prototype? 每个 JavaScript 函数(构造函数)都有一个 prototype 属性,它是一个对象。所有由该函数创建的 实例对象 都会继承这个原型对象的属性和方法。 function Person(name) { this.name = name; } // 方法添加到原型,所有实例共享 Person.prototype.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; const p1 = new Person("Joe"); const p2 = new Person("Mary"); p1.sayHello(); // Hello, my name is Joe p2.sayHello(); // Hello, my name is Mary // 实例的 __proto__ 指向构造函数的 prototype console.log(p1.__proto__ === Person.prototype); // true 在上面的代码中: Person.prototype 是 Person 构造函数的原型对象。 sayHello 方法被所有 Person 的实例共享,而不是每个实例都创建一份新的拷贝,节省内存。 p1.__proto__ 指向 Person.prototype,表示 p1 继承了 Person.prototype 上的方法。 __proto__ 是实例对象的隐式原型引用(非标准属性,可以用 Object.getPrototypeOf() 替代)。 属性__proto__ 与 prototype 关系 JavaScript 中每个对象都有一个隐藏的 __proto__ 属性(这个并非标准属性,虽然大部分浏览器都支持),它指向创建该对象的构造函数的 prototype: console.log(p1.__proto__ === Person.prototype); // true console.log(Person.prototype.__proto__ === Object.prototype); // true console.log(Object.prototype.__proto__ === null); // true 这个原型链的结构如下: // 访问对象属性时,若当前对象没有,则沿原型链向上查找。 // Object.prototype 是原型链的终点,其 __proto__ 为 null。 p1 → Person.prototype → Object.prototype → null 原型链继承 可以通过 prototype 让一个构造函数继承另一个构造函数的方法和属性。
阅读全文