JS对象组合通过函数添加原型函数

时间:2017-11-08 17:13:59

标签: 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的值是否与类型匹配。我没有为每个属性编写四个原型函数,而是执行了以下操作:

文件: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模块结构。

1 个答案:

答案 0 :(得分:0)

您的解决方案无效。设置值后,您就会隐藏存取方法。另外,为什么要在需要字符串的方法中测试typeof !== "number"

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

我认为你最好不要尝试编写惯用的JS代码。以最简单,最直接的方式使用语言提供的功能。不要试图对这些结构过于聪明。在JS拥有所有新功能之前,人们尝试了这样的东西,而且似乎从来没有这么好。

相关问题