JavaScript 通过调用祖先函数进行继承

标签 javascript node.js inheritance

我正在尝试(对我来说)一种新的继承类型。我想使用一个参数来调用继承的函数,该参数确定返回哪个继承者对象。

下面是一个例子来说明我的意思:

function Localizor(type) {
  this.language = "English"
  this.endonym = "English"

  if (window[type]) {
    return new window[type]()
  }
}
Localizor.prototype.native = function native() {
  return "I speak " + this.endonym
}
Localizor.prototype.english = function () {
  return "I speak " + this.language
}


function French () {
  this.language = "French";  
  this.endonym = "français"
}
French.prototype = new Localizor()
French.prototype.native = function french() {
  return "Je parle " + this.endonym
}


function Thai () {
  this.language = "Thai";  
  this.endonym = "ไทย"
}
Thai.prototype = new Localizor()
Thai.prototype.native = function thai() {
  return "พูดภาษา" + this.endonym
}

如果我在不带参数(或使用无效参数)的情况下调用 new Localizor(),我会得到一个简单的英语对象。如果我用“法语”或“泰语”参数调用它,我会得到一个对象,其中继承者会覆盖一些继承的方法,以便它说法语或泰语。例如:

var thai = new Localizor("Thai")
var feedback = thai.language + " | " + thai.endonym + " | " + thai.english() + " | " + thai.native()  
console.log(feedback)

这给了我输出Thai | ไทย |我说泰语 | พูดภาษาไทย

我有三个问题:
1. 这种类型的继承是否已在某处记录(是否有名称)?
2、这样工作有危险吗?
3. 此示例检查 window[type] 是否存在,这在浏览器中工作时很有用。如果这是在 Node.js 的模块中,是否有等效的方法来确定模块中是否存在函数?

编辑响应 Zero21xxx

这是我发现的一种检测模块中构造函数是否存在的方法,但对我来说它看起来是危险的乱伦。它有什么风险?有哪些更好的方法可用?

function extend(Child, Parent) {
  function F() {}
  F.prototype = Parent.prototype
  Child.prototype = new F()
  //Child.prototype.constructor = Child
  Child.parent = Parent.prototype
}

function Localizor(type) {
  this.language = "English"
  this.endonym = "English"

  this.French = function français () {
    this.language = "French";  
    this.endonym = "français"
  }
  extend(this.French, this)
  this.French.prototype.native = function french() {
    return "Je parle " + this.endonym
  }

  this.Thai = function ไทย () {
    this.language = "Thai";  
    this.endonym = "ไทย"
  }
  extend(this.Thai, this)
  this.Thai.prototype.native = function thai() {
    return "พูดภาษา" + this.endonym
  }

  if (typeof this[type] === "function") {
   return new this[type]()
  }
}
Localizor.prototype.native = function native() {
  return "I speak " + this.endonym
}
Localizor.prototype.english = function () {
  return "I speak " + this.language
}

module.exports = Localizor

最佳答案

以我的拙见,您应该为 EnglishFrenchThai 提供三个独立的构造函数,它们继承自一个公共(public)构造函数(我们称之为区域设置)。它看起来如下:

function Locale(constructor, language, endonym, native) {
    this.constructor = constructor;
    this.language = language;
    this.endonym = endonym;

    this.native = function () {
        return native + this.endonym;
    };
}

Locale.prototype.english = function () {
    return "I speak " + this.language;
};

function English() {}
function French() {}
function Thai() {}

English.prototype = new Locale(English, "English", "English", "I speak ");
French.prototype = new Locale(French, "French", "français", "Je parle ");
Thai.prototype = new Locale(Thai, "Thai", "ไทย", "พูดภาษา");

这导致 separation of concerns :每个构造函数仅精确执行其预期目的。不多不少。现在您可以创建一个 localizer 函数,如下所示:

function localizer(language) {
    switch (language) {
    case "French": return new French;
    case "Thai": return new Thai;
    default: return new English;
    }
}

因此,您需要做的就是调用localizer来获取所需的Locale

关于JavaScript 通过调用祖先函数进行继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18558324/

相关文章:

c++ - 派生类和单例

javascript - 使用 `fillRect` 绘制 3D 模型太慢?

javascript - 使用 Javascript 正则表达式从字符串末尾删除 int 和 float

node.js - 在多个微服务上使用 Mongoose 模式

java - 从父类(super class)调用方法不起作用 Java

java - 使用关键字 'this'

javascript - jQuery : how to trigger an event when the user clear a textbox

javascript - 如何像流畅的播放列表一样链接播放多个 HTML5 音频文件?

json - 使用终端在特定目录中创建 json 文件

node.js - 在 Node js 中安装 bcrypt 时出错?每当我运行 npm install install --save?