JavaScript对象不是从原型链继承的

JavaScript objects not inheriting from prototype chain

本文关键字:继承 原型 对象 JavaScript      更新时间:2023-09-26

我在Chrome 21中为构造函数定义原型时遇到问题。我正在做一个大项目,在这个项目中,我试图用一些非常松散的数据封装来实现一个基于伪类的结构(因此是"子类"属性),但我对JavaScript中的原型和继承相对陌生,无法找出问题所在。StackOverflow上还有其他类似的线程,但没有解决这个问题。

以下是我正在使用的构造函数:

function Root()
{
  this._subclass = "Root";
  this.subclass = function(){
    return this._subclass;
  };
  this._date;
  this.date = function(){
    return this._date;
  };
}
function CustomDateTime()
{
  this._subclass = "CustomDateTime";
  this._value = new Date();
}
CustomDateTime.prototype = new Root;
function CurrentDate()
{
  this._subclass = "CurrentDate";
}
CurrentDate.prototype = new CustomDateTime;

直觉上,在我看来,我应该能够做到这一点(因为subclass()是在Root构造函数中定义的):

var now = new CurrentDate();
alert(now.subclass()); // should alert "CurrentDate"

但是在运行脚本时,我得到了一个CCD_。此外,如果我更改CurrentDate构造函数以包含此警报:

function CurrentDate()
{
  alert(this._subclass);
  this._subclass = "CurrentDate";
}
CurrentDate.prototype = new CustomDateTime;

得到的消息是CCD_ 4。

如果我改为分配var now = new CustomDateTime(),那么调用subclass()方法将按预期返回"CustomDateTime"。我还定义了另一个构造函数ModelObject,它的原型设置为Root,subclass()在这些对象上也按预期执行。

我从中得到的是,CurrentDate构造函数被排除在CurrentDate:CustomDateTime:Root链之外,只是作为一个独立的构造函数来调用——使用该函数创建的对象似乎不是从分配给CurrentDate函数对象的原型继承的。

这不是使用JavaScript原型的正确方式吗?再说一遍,在我看来,这应该进展得很顺利。。

感谢"灰色状态即将到来"的响应。看到代码在jsfiddle中正确运行告诉我,当你在一个.html页面上包含多个标签时,你必须按照它们的原型继承顺序放置标签。如果CurrentDate在CustomDateTime之前,则在分配CurrentDate.prototype时尚未定义CustomDateTime函数。