原型
函数原型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);
原型链
原型链是 JavaScript 中用于实现继承和属性查找的一种机制。每个对象都有一个原型对象(prototype),通过原型对象可以实现属性和方法的继承。当访问一个对象的属性或方法时,如果对象本身不存在这个属性或方法,JavaScript 引擎会沿着原型链向上查找,然后在原型对象上找到该属性后,再返回对应的值,直到找到相应的属性或方法或者到达原型链的顶端(Object.prototype)为止。
Object.prototype 是原型链的顶端
Object.prototype 是原型链的顶端对象,它的原型是 null。
如果你想创建一个没有原型的对象,可以使用 Object.create(null)
console.log(Object.prototype.__proto__); // 输出: null
创建时函数的初始原型,只有一个名为constructor的属性和[[prototype]]的内置属性。