Javascript什么是原型和原型链,八股文

发布于:2025-06-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

原型:函数都有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 Alice

console.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 Alice

console.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版本完全一样:实例原型 → 类的 prototypeObject.prototypenull

3.总结

  • JavaScript版本用构造函数和显式原型,适合传统理解原型链机制。

  • TypeScript版本用类语法,更符合现代代码风格,本质上还是基于JavaScript原型链实现。


网站公告

今日签到

点亮在社区的每一天
去签到