← 返回目录

第 7 卷

第 7 / 19 卷日期:

32printPrototypeChain(p);

方式2:循环遍历 + __proto__(兼容性好,非标准但广泛支持)

Code block

1/** 2* 打印对象的完整原型链(使用__proto__)

3* @param{Object} obj-要打印原型链的对象
4*/
5function printPrototypeChain2(obj) {
6let currentObj = obj;
7console.log(`===== ${obj.constructor.name || "对象"}的原型链=====`);
8while (currentObj !== null) {
9const constructorName = currentObj.constructor ?

currentObj.constructor.name : "未知对象";

10console.log(currentObj);

11console.log(`构造函数:${constructorName}`);
12//使用__proto__获取下一个原型
13currentObj = currentObj.__proto__;
14if (currentObj !== null) {
15console.log("↓");
16}
17}
18console.log("=====原型链终点(null)=====");
19}

20 21// 测试

22const arr = [1,2,3];

23// 数组的原型链:arr -> Array.prototype -> Object.prototype -> null 24printPrototypeChain2(arr);

  1. JavaScript (或者其他语言中)为什么需要使用this关键字?

this 关键字是面向对象编程中的核心关键字,JavaScript(及其他面向对象语言,如Java、 Python)引入 this 的核心目的是简化对象方法对自身属性/方法的引用,明确当前执行上下文的对

象,提升代码的可读性、复用性和灵活性,具体原因如下:

  1. 明确当前对象(上下文),解决命名冲突

◦ 在对象的方法中,需要访问对象自身的属性或其他方法,若没有 this,则需要通过对象名直

◦ this 自动指向当前调用方法的对象,无需硬编码对象名,明确了方法所属的上下文,避免了

Code block

1// 无this的问题:硬编码对象名,灵活性差 2const person1 = {

3name: "张三", 4sayHello: function() {

5console.log(`Hello, ${person1.name}`); // 硬编码person1 6}

7};

8// 若对象名改为p1,方法内部也需要修改 9const p1 = person1;

10delete person1;

11p1.sayHello(); // 报错:person1 is not defined 12

13//有this的优势:自动指向调用对象,无需硬编码
14const person2 = {
15name: "李四",
16sayHello: function() {
17console.log(`Hello, ${this.name}`);// this指向调用者
18}
19};
20const p2 = person2;
21delete person2;
22p2.sayHello();// Hello,李四(正常执行)
  1. 支持对象复用,实现方法共享

◦ 构造函数或类(ES6)中, this 指向当前创建的实例对象,使得同一个方法可以被多个实例

共享,每个实例调用方法时, this 自动绑定到该实例,访问该实例的私有属性。

  • 若没有 this,则无法实现方法的共享,每个实例都需要单独定义方法,浪费内存。

Code block

1function Person(name) { 2this.name = name; // this指向当前实例

3} 4// 方法共享给所有实例

5Person.prototype.sayHello = function() {
6console.log(`Hello, ${this.name}`);// this指向调用该方法的实例
7};
8const p3 = new Person("王五");
  1. 简化继承中的方法调用

◦ 在原型链继承或类继承中, this 会自动指向子类/派生类的实例,使得子类可以复用父类的方

法,并访问子类自身的属性,无需手动传递实例对象。

  • 这简化了继承逻辑,提升了代码的复用性。

Code block

1// 父构造函数 2function Animal(type) {

3this.type = type;

4} 5Animal.prototype.eat = function() {

6console.log(`${this.type}在进⻝`);// this指向子类实例
7};
8//子构造函数
9function Dog(name) {
10Animal.call(this, "狗");//绑定this为Dog实例
11this.name = name;
12}
13//继承Animal的方法
14Dog.prototype = Object.create(Animal.prototype);
15Dog.prototype.constructor = Dog;

16 17const dog = new Dog("旺财");

18dog.eat(); // 狗在进⻝(this指向dog实例,访问dog.type)

  1. 适应动态上下文变化(JavaScript特有优势)

◦ JavaScript中的 this 是动态绑定的(箭头函数除外),其指向由函数的调用方式决定,而非

定义方式。

◦ 这种动态特性使得函数可以在不同的上下文对象中复用,提升了函数的灵活性和通用性(如事

件处理函数、回调函数中, this 可以指向DOM元素、Promise对象等)。

  1. JavaScript中,this的绑定规则有哪些?

JavaScript中 this 的绑定(除箭头函数外)由函数的调用方式决定,而非定义方式,核心有5种绑定规则,优先级从高到低依次为:new绑定 > 显式绑定 > 隐式绑定 > 默认绑定 > 箭头函数继承绑定。

全站分卷索引 · 19 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷