Javascript什么是原型和原型链,八股文
原型:函数都有prototype属性,称之为原型,也称为原型对象
原型可以放一些属性和方法,共享给实例对象使用
原型可以做继承
原型链:对象都有__proto__属性,这个属性指向它的原型对象,原型对象也是对象,也有__proto__属性,指向原型对象的原型对象,这样一层一层形成的链式结构称为原型链,最顶层找不到则返回 null
1.javascript原型链(经典函数构造器 + prototype)
function Person(name) {this.name = name;
}Person.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name}`);
};const alice = new Person('Alice');
alice.sayHello(); // Hello, my name is Aliceconsole.log(alice.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null
解释:
-
每个对象都有一个内部属性
[[Prototype]]
(常用__proto__
访问),指向它的原型对象。 -
当访问对象的属性或方法时,如果自身没有,会沿着
[[Prototype]]
一层层往上找,这个查找链就是原型链。 -
上面例子中,
alice
访问sayHello
方法时没在自身属性里找到,就去它的原型对象Person.prototype
查找。 -
Person.prototype
的原型是Object.prototype
,这构成了原型链的多层关系。 -
Object.prototype
的原型是null
,链条终点。
2.TypeScript 版本(class 语法)
class Person {name: string;constructor(name: string) {this.name = name;}sayHello() {console.log(`Hello, my name is ${this.name}`);}
}const alice = new Person('Alice');
alice.sayHello(); // Hello, my name is Aliceconsole.log(Object.getPrototypeOf(alice) === Person.prototype); // true
console.log(Object.getPrototypeOf(Person.prototype) === Object.prototype); // true
console.log(Object.getPrototypeOf(Object.prototype)); // null
解释:
-
TypeScript 使用
class
关键字声明类,语法更现代,代码更清晰。 -
sayHello
是类的方法,实际挂载在Person.prototype
上,实例通过原型链访问。 -
Object.getPrototypeOf()
用来获取对象的原型,效果和__proto__
类似,但更标准安全。 -
原型链关系和JavaScript版本完全一样:实例原型 → 类的
prototype
→Object.prototype
→null
。
3.总结
-
JavaScript版本用构造函数和显式原型,适合传统理解原型链机制。
-
TypeScript版本用类语法,更符合现代代码风格,本质上还是基于JavaScript原型链实现。