在JS中处理Object的嵌套属性

时间:2017-07-14 18:00:28

标签: javascript node.js oop object lodash

您好我在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,但我有很多模块,而且我不想管理每个特定的案例。

1 个答案:

答案 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;再一次,没有冒犯意味着。