JavaScript中constructor属性的指向与修正方法

作者:闭包旅人时间:2026-10-30 08:36:25浏览:400

本文解析JavaScript中constructor属性的行为机制。默认情况下,函数prototype的constructor指向该函数。但当重写prototype对象时,constructor会意外指向Object。通过直接赋值Person.prototype.constructor = Person即可恢复正确指向,确保实例能正确识别其构造函数。

constructor的基本定义

constructor,即构造函数,这一概念在开发中十分常见。它的核心特性是始终指向创建当前实例的那个构造函数。

prototype修改导致的指向异常

需要特别注意,每个函数都拥有一个prototype属性,该属性的constructor默认指向函数本身。然而,一旦我们修改了函数的prototype属性,就会引发意想不到的行为变化。例如:


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

Person.prototype.getAge = function(){
  return this.age;
}
Person.prototype.getName = function(){
  return this.name;
}

var p = new Person("Nicholas",18);
console.log(p.constructor); //Person(name, age)
console.log(p.getAge()); //18
console.log(p.getName()); //Nicholas

如果采用以下代码结构:


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

Person.prototype = {
  getName:function(){
    return this.name;
  },
  getAge:function(){
    return this.age;
  }
}

var p = new Person("Nicholas",18);
console.log(p.constructor); //Object()
console.log(p.getAge()); //18
console.log(p.getName()); //Nicholas

此时会发现constructor的指向发生了改变。

造成这一现象的根本原因在于,prototype本身也是一个对象。上述代码在逻辑上等价于:


Person.prototype = new Object({
  getName:function(){
    return this.name;
  },
  getAge:function(){
    return this.age;
  }
});

由于constructor始终指向创建当前对象的构造函数,因此不难理解,在上述代码中,p.constructor的输出结果变为Object。

修正constructor指向的方法

如果在修改了prototype之后,仍希望constructor指向Person构造函数,解决方法很简单:直接为Person.prototype.constructor进行赋值即可:


Person.prototype = {
  constructor:Person,
  getName:function(){
    return this.name;
  },
  getAge:function(){
    return this.age;
  }
}

以上关于JavaScript中constructor的讨论到此结束,希望能为读者提供有益参考。

作者最新文章