如何在JavaScript中内置JavaScript类的子类中使用基类方法

如何在JavaScript中内置JavaScript类的子类中使用基类方法,javascript,Javascript,例如,在c语言中,我可以扩展一个框架类型并为我的类型分配一个表达式,它将保留基类型的所有成员,但也有我的扩展方法 我正试着继承他的句子 注意,此处不适用建议的副本,因为范围不受这些技术的影响 如何在javascript中实现这一点?我有: /* Namespace */ var WebPageReader = WebPageReader || {}; /* Classes */ WebPageReader.Sentence = function(range) { this.setSta

例如,在c语言中,我可以扩展一个框架类型并为我的类型分配一个表达式,它将保留基类型的所有成员,但也有我的扩展方法

我正试着继承他的句子

注意,此处不适用建议的副本,因为范围不受这些技术的影响

如何在javascript中实现这一点?我有:

/* Namespace */
var WebPageReader = WebPageReader || {};

/* Classes */
WebPageReader.Sentence = function(range) {
    this.setStart(range.startContainer, range.startOffset); // bombs here
    this.setEnd(range.endContainer, range.endOffset);  
};

function test(){
  WebPageReader.Sentence.prototype = new Range();
  var dom = new WebPageReader.Dom();
  var s = new WebPageReader.Sentence(dom.GetSelectedRange());
  alert(s.endOffset)  ;
}
WebPageReader.Dom = function() {

  /* public methods */
  this.GetSelectedRange = function() {
    var sel;
    if (window.getSelection) {
      sel = window.getSelection();
      if ((sel.type == "Range" || allowCaretSelection) && sel.rangeCount) {
        return sel.getRangeAt(0);
      }
    }
    return null;
  }
}
这会产生以下错误:

未捕获类型错误:非法调用

尝试2

当我将代码更改为以下内容时:

/* Namespace */
var WebPageReader = WebPageReader || {};

/* Classes */
WebPageReader.Sentence = function(range) {
  Range.call(this);
};

function test(){
  WebPageReader.Sentence.prototype = new Range();
  var dom = new WebPageReader.Dom();
  var s = new WebPageReader.Sentence(dom.GetSelectedRange());
  alert(s.endOffset)  ;
}
我得到这个错误

未捕获类型错误:构造“范围”失败:请使用“新建” 运算符,此DOM对象构造函数不能作为函数调用


您没有正确地子类化。你应该使用ES6类

变量WebPageReader={ Dom:函数{ this.GetSelectedRange=函数{ if!window.getSelection返回null; 返回window.getSelection.getRangeAt0; } }, 班级扩大了范围{ 构造器范围{ 超级的 this.setStartrange.startContainer,range.startOffset; this.setEndrange.endContainer,range.endOffset; } } }; document.body.addEventListener'click'函数{ var dom=newWebPageReader.dom; var s=新WebPageReader.Sentencedom.GetSelectedRange; console.logs.endOffset; };
选择文本您没有正确地子类化。你应该使用ES6类

变量WebPageReader={ Dom:函数{ this.GetSelectedRange=函数{ if!window.getSelection返回null; 返回window.getSelection.getRangeAt0; } }, 班级扩大了范围{ 构造器范围{ 超级的 this.setStartrange.startContainer,range.startOffset; this.setEndrange.endContainer,range.endOffset; } } }; document.body.addEventListener'click'函数{ var dom=newWebPageReader.dom; var s=新WebPageReader.Sentencedom.GetSelectedRange; console.logs.endOffset; };
选择text内置JavaScript类,如Error、Array或Range。在支持ES6类从范围扩展的浏览器中可能会起作用,但这是一件脆弱的事情,我不认为在这种情况下这样做是合理的。我认为您只需要helper方法,而不需要子类化。您可以通过以下方法获得相似的外观:


内置JavaScript类,如Error、Array或Range。在支持ES6类从范围扩展的浏览器中可能会起作用,但这是一件脆弱的事情,我不认为在这种情况下这样做是合理的。我认为您只需要helper方法,而不需要子类化。您可以通过以下方法获得相似的外观:


你试过扩展吗,比如类句子扩展了Range?可能是@TamasHegedus的重复,它不能用Range作为基类。Range和其他人玩得不好。我们的Range声明在哪里?@TamasHegedus,仍然得到非法调用。这让我想起了我在学校操场上领导一个祈祷小组时遇到的麻烦。你试过扩展吗,比如班级句子扩展范围?可能是@TamasHegedus的复制品,它不能将范围作为一个基本班级。Range和其他人玩得不好。我们的Range声明在哪里?@TamasHegedus,仍然得到非法调用。这让我想起了我在学校操场上领导一个祈祷小组时遇到的麻烦。我把我的应用程序作为一个chrome扩展放在谷歌商店上。所有的chrome用户都会跳到它的b/c上,这太酷了,哈哈。你认为有百分之多少的人没有版本42,但版本类已经推出了?很好的回答,顺便说一句@toddmo Chrome已经强制更新,所以我想它对大多数Chrome用户都适用。请参阅一些统计数据。根据您的数据为96%。含糖的我试试看!我把我的应用程序作为chrome的扩展放在谷歌商店上。所有的chrome用户都会跳到它的b/c上,这太酷了,哈哈。你认为有百分之多少的人没有版本42,但版本类已经推出了?很好的回答,顺便说一句@toddmo Chrome已经强制更新,所以我想它对大多数Chrome用户都适用。请参阅一些统计数据。根据您的数据为96%。含糖的我试试看!
// Would have been written
Sentence.prototype.additionalOperation = function() {
    return this.endContainer ...;
}

// can write this:
function additionalOperation() {
    return this.endContainer ...
}

// usage
// instead of:
new Sentence(range).additionalOperation();
// use this:
additionalOperation.call(range);
// or with bind syntax:
range::additionalOperation();