JavaScript中constructor属性的指向与修正方法
本文解析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的讨论到此结束,希望能为读者提供有益参考。
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
