javascript - 通过函数添加原型(prototype)函数来组合 JS 对象

标签 javascript node.js object composition object-composition

我一直在通过 Javascript(特别是 NodeJS)中的组合来摆弄对象构建,并且我想出了一种构建对象的方法,但我需要知道这是否是一种疯狂的做事方式。

简单的版本是这样的: 我有两个对象,都有两个属性,一个保存数字,另一个保存字符串。

文件:Cat.js

function Cat() {
  this.name = 'Fuzzy Whiskerkins';
  this.owner = 'James';
}
module.exports = Cat;

文件:Car.js

function Car() {
  this.color = 'blue';
  this.owner = 'James';
}
module.exports = Car;

我现在想为这两个对象中的所有属性添加一个基本的 getter/setter 函数。我还希望能够检查传递给这些 setter 的值是否与类型匹配。我没有为每个属性编写四个原型(prototype)函数,而是执行了以下操作:

文件:StringProperty.js

module.exports = function(newObject, propertyName) {
  newObject.prototype[propertyName] = function( newString ) {
    if ( typeof newString !== 'undefined' ) {
      if ( typeof newString !== 'string' ) {
        return;
      }
      this.properties.[propertyName] = newString;
      return this;
    }
    return this.properties.[propertyName];
  }
}

文件:Cat.js

var StringProperty = require('./StringProperty.js');
function Cat() {
  this.properties.name = 'Fuzzy Whiskerkins';
  this.properties.owner = 'James';
}
StringProperty( Cat, 'name' );
StringProperty( Cat, 'owner' );
module.exports = Cat;

文件:Car.js

var StringProperty = require('./StringProperty.js');
function Car() {
  this.properties.color = 'blue';
  this.properties.owner = 'James';
}
StringProperty( Car, 'color' );
NumberProperty( Car, 'owner' );
module.exports = Car;

现在,这两个对象都具有它们所需的所有基本功能,并且我能够使用最少量的代码来完成此操作,并且每当我需要添加另一个字符串属性时,我必须添加的代码量将是最少的。

我疯了吗?这是一件疯狂的事情吗/有更好的方法吗?

编辑: 我想要实现的目标是,我正在开发的应用程序有 100 多个对象,每个对象都有 10 多个属性,而必须为其中每一个属性编写几乎完全相同的代码的想法并不适合我。我希望能够有一些代码来添加属性并创建 getter/setter 函数(添加属性限制分歧的选项,例如字符串属性的不同长度限制)。我已经看过多个在 JS 中通过组合来构造对象的示例,但我尝试过的没有任何内容适合 NodeJS 模块结构。

最佳答案

您的解决方案将不起作用。一旦你设置了一个值,你就隐藏了访问器方法。另外,为什么要在需要字符串的方法中测试 typeof !== "number"

解决这些问题后,您的类型检查就会默默退出。一旦你尝试设置一个值却无法弄清楚为什么它没有设置,你就会讨厌这一点。如果您想要更强大的类型系统,我会使用 TypeScript。

我认为你最好尝试编写惯用的 JS 代码。以最简单、最直接的方式使用该语言提供的功能。不要试图对这些结构表现得太聪明。在 JS 拥有所有新功能之前,人们尝试过类似的东西,但似乎从来没有那么顺利。

关于javascript - 通过函数添加原型(prototype)函数来组合 JS 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47185776/

相关文章:

javascript - 调整浏览器窗口大小时,addEventListener 'resize' 不会触发

javascript - 如何将文件逐行读取到 node.js 中的数组中

javascript - 无法将变量传递给事件监听器

javascript - Node + Express + mongoose 查询认证

javascript - MongoDB + Node.js : How to use a Schema from an external file for another Schema?

javascript - Next.js 是否需要运行 Node 服务器?

c++ - 移动构造函数再次被调用 C++

python - 使用 Python 转换为 JSON 的对象列表

javascript - 不确定为什么方法会吐出它吐出的东西

javascript - string.repeat 制表符/空格在跨度中不起作用