js 原型链

73 阅读2分钟

原型

函数原型prototype(显示原型)和对象原型__proto__(隐式原型)

函数原型

每个函数都有一个特殊的属性称为 prototype,它是函数被创建时自动生成的一个对象。函数原型对象用于存储可以被函数的所有实例共享的属性和方法。

function Person(name) {
    this.name = name;
}

// Person 函数的原型对象
Person.prototype.sayHello = function() {
    console.log('Hello, my name is ' + this.name);
};

const person1 = new Person('Alice');
const person2 = new Person('Bob');

person1.sayHello(); // 输出:Hello, my name is Alice
person2.sayHello(); // 输出:Hello, my name is Bob

对象原型

每个对象都有一个特殊的内部属性 __proto__,它指向该对象的原型。原型可以是另一个对象或者 null

let person1 = new Person('Alice');
console.log(person1.__proto__ ); // Person.prototype

2者之间关系

函数原型和对象原型之间有一个重要的关系:通过函数原型,我们可以在创建的对象之间共享方法和属性。 当你创建一个新的对象时,JavaScript 引擎会自动将对象的 __proto__ 属性设置为该构造函数的 prototype 属性的值。

constructor属性

在原型链中,constructor 属性指的是指向创建对象的构造函数的引用。每个对象都有一个 constructor 属性,它引用了创建该对象的构造函数。

function Person(name) {
    this.name = name;
}

const person1 = new Person('Alice');

// person1 的 constructor 属性指向 Person 构造函数
console.log(person1.constructor === Person); // 输出: true
//创建一个构造函数
const Person = function(){};
//创建一个函数实例
let per = new Person();

console.log(Person.prototype === per.__proto__);  // true
console.log(Person.prototype.constructor === Person);  // true
let Person = function(){};
console.log(Person.prototype);

image.png

原型链

原型链是 JavaScript 中用于实现继承和属性查找的一种机制。每个对象都有一个原型对象(prototype),通过原型对象可以实现属性和方法的继承。当访问一个对象的属性或方法时,如果对象本身不存在这个属性或方法,JavaScript 引擎会沿着原型链向上查找,然后在原型对象上找到该属性后,再返回对应的值,直到找到相应的属性或方法或者到达原型链的顶端(Object.prototype)为止。

image.png

image.png

Object.prototype 是原型链的顶端

Object.prototype 是原型链的顶端对象,它的原型是 null。 如果你想创建一个没有原型的对象,可以使用 Object.create(null)

console.log(Object.prototype.__proto__); // 输出: null

创建时函数的初始原型,只有一个名为constructor的属性和[[prototype]]的内置属性。