您好我在OOP风格的NodeJS中编写模块。
我有多个简单对象,包含原始数据和包含其他对象的多个复杂对象。
const Simple = function Simple() {
this.x = 0;
this.y = 0;
}
Simple.prototype.getArea = function() {
return this.x * this.y;
}
const Complex = function Complex() {
this.ownProp = 0;
this.nestedProp = new Simple();
this.otherNestedProp = new otherSimple();
}
Complex.prototype.set = function(key, value) {
this[key] = value;
}
Complex.prototype.otherSet = function(value) {
Object.assign(this, value);
}
我的问题是,使用我的API的用户可以通过这样做来破坏:
let simple = new Simple();
simple.getArea(); // 0
let complex = new Complex();
complex.nestedProp.getArea(); // 0
complex.set('nestedProp', {x: 5, y: 6});
complex.nestedProp.getArea(); // THROW <----
let complex = new Complex();
complex.nestedProp.getArea(); // 0
complex.set({nestedProp: {x: 5, y: 6});
complex.nestedProp.getArea(); // THROW <----
是否有一个lodash函数只能分配这种嵌套Object的值。
还是有一种很好的方法可以解决这类问题吗?
注意:我可以查看instanceof
,但我有很多模块,而且我不想管理每个特定的案例。
答案 0 :(得分:1)
您似乎认为将{x: 1, y:2}
之类的内容传递给Complex.set会神奇地使x和y在Simple内部结束。我认为你对Javascript如何运作感到困惑,没有冒犯意味着。
这是一个实现,可以使事情大致按照你想要的方式工作。
const Simple = function Simple() {
this.x = 0;
this.y = 0;
}
Simple.prototype.getArea = function() {
return this.x * this.y;
}
Simple.prototype.set = function (x, y) {
this.x = x;
this.y = y;
}
const Complex = function Complex() {
this.nestedProp = new Simple();
}
Complex.prototype.set = function(props) {
this.nestedProp.set(props.x, props.y);
}
let complex = new Complex();
complex.nestedProp.getArea(); // 0
complex.set({x: 5, y: 6});
complex.nestedProp.getArea(); // 30
属性x和y从Complex显式传递给Simple,直到它们应该到达它们的位置。您可以将x和y作为单独的参数传递(请参阅Simple set
)或作为对象的属性(请参阅Complex set
)。
但是如果你认为x和y会一直到最后,你需要在编写代码之前学习基本的OOP;再一次,没有冒犯意味着。