我一直在通过 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/