深入分析js中的constructor和prototype


在JavaScript中,`constructor` 和 `prototype` 是与函数和对象创建密切相关的两个核心概念,它们主要用在基于原型的继承体系中。

### 1. `constructor`

- `constructor` 是一个指向创建对象实例的构造函数的指针。在JavaScript中,每个对象实例都有一个 `constructor` 属性,它指向创建该实例的构造函数。默认情况下,所有的对象实例都会从它们的原型上继承一个 `constructor` 属性。

- 当你定义一个构造函数时,它默认会有一个 `constructor` 属性,该属性指向函数自身。但通常这个属性不会被显式地在构造函数体内部修改,因为它是用来指示哪个函数是用来创建对象的。


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

var person1 = new Person("Alice");

console.log(person1.constructor === Person); // true
console.log(person1.constructor === Object); // false

### 2. `prototype`

- `prototype` 是函数的一个属性,它是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。简而言之,当你创建一个构造函数时,它的 `prototype` 属性就被自动设置为一个对象(默认为一个空的Object对象),这个对象可以包含由该构造函数创建的所有对象实例共享的属性和方法。

- 当一个对象通过构造函数创建时,这个新创建的对象内部会包含一个指向构造函数的 `prototype` 对象的指针(在大多数现代JavaScript引擎中,这个指针被称为 `__proto__`,尽管它不是ECMAScript标准的一部分,但许多浏览器都实现了它,以便开发者可以更容易地理解原型链)。


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

Person.prototype.sayHello = function() {
    console.log("Hello, my name is " + this.name);
};

var person1 = new Person("Alice");
var person2 = new Person("Bob");

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

console.log(person1.__proto__ === Person.prototype); // true in many environments
console.log(Object.getPrototypeOf(person1) === Person.prototype); // true, the standard way

### 总结

- `constructor` 是对象的一个属性,指向创建该对象的构造函数。

- `prototype` 是函数的一个属性,指向一个对象,这个对象包含了所有实例共享的属性和方法。

- 通过 `prototype` 机制,JavaScript实现了基于原型的继承,允许对象继承另一个对象的属性和方法。

- 了解和掌握 `constructor` 和 `prototype` 的关系对于深入理解JavaScript的继承机制非常重要。