JavaScript Prototype.js 类的定义方式与 constructor 修复
作者:木棉时间:2026-10-23 19:35:08浏览:583
本文介绍 Prototype.js 框架中通过 Class.create() 定义类的方法。该方法通过返回构造函数并调用 initialize 实现初始化。由于重写原型对象会导致 constructor 指向错误,文章演示了如何在原型中显式指定 constructor 以修复此问题,确保实例的 constructor 正确指向原类。
Prototype.js 类的定义与 constructor 修复
6、Prototype.js 的写类方式
具体实现代码如下:
// 这是 Prototype.js 库中的核心代码片段
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
// 简化后的逻辑示意
function Clazz() {
return function(){
this.initialize.apply(this,arguments);
}
} 按照以下步骤定义一个类:
示例代码如下:
// 定义类名 Person
var Person = Class.create();
// 通过覆盖原型对象来定义 Person 的属性和方法
Person.prototype = {
initialize : function(name) {
this.name = name;
},
getName : function() {
return this.name;
},
setName : function(name) {
this.name = name;
}
}
// 创建实例对象
var p = new Person("jack");
console.log(p.constructor == Person);// 输出结果为 falseinitialize 方法负责对象的初始化工作,类似于传统构造函数,其他方法按顺序定义在原型中即可。
这里存在一个问题,通过执行 p.constructor == Person 返回 false 可以看出,这是 Prototype.js 的一个小缺陷。原因是直接重写了 Person 的原型对象,导致 constructor 属性丢失或指向错误。为了使 constructor 能正确指向构造器,只需在重写原型时手动维护 constructor 属性即可。
修复代码如下:
Person.prototype = {
constructor : Person,// 注意这里需要显式指定
initialize : function(name) {
this.name = name;
},
getName : function() {
return this.name;
},
setName : function(name) {
this.name = name;
}
}完成上述修改后,再次执行 p.constructor == Person 将返回 true。
作者最新文章
JS合并多个数组的三种方法:concat、spread与flat
2026-11-05 17:39:45
JavaScript怎么准确判断数据类型:typeof、instanceof与Object.prototype.toString
2026-11-05 17:09:21
JS中将数组和对象混合组装为JSON字符串
2026-11-05 16:41:42
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
