2017-07-14 54 views
1

嗨我在OOP风格的NodeJS中编写模块。在JS中处理对象的嵌套属性

我有多个包含原始数据的简单对象和包含其他对象的多个复杂对象。

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功能只分配这样的嵌套对象的值。
还是有一个很好的方法来管理这类问题?

注:我可以检查instanceof但我有很多模块,我不想管理每个特定的情况。

+0

你用'otherSet'函数试着怎么样? –

+0

准备好将项目迁移到使用TypeScript吗?这将解决您只允许特定类型的对象分配的问题。 –

+0

准确地说,人们将被允许执行'complex.set('nestedProp',{x:5,y:6});''不是吗?甚至'complex.nestedProp = {x:10,y:90}'这个还是不是? –

回答

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作为单独的参数(请参阅简单的set)或作为对象的属性(请参阅复杂的set)。

但是,如果你认为x和y会一直到最后,你需要在编写代码之前学习基本的OOP;再一次,没有冒犯的意思。

+0

根本没有冒犯性,但我知道Javascript是如何工作的。我只是不知道Javascript中的OOP最佳实践,因为你有很多自由。 Ofc我给你的例子非常简单,但我的代码更加复杂,我不想在每个setter中处理太多特定情况。 –

+0

那么我很抱歉,我希望我的回答有一些帮助! – MySidesTheyAreGone

+0

^^我在开始的时候有同样的想法,但是如果有100多个对象取决于彼此,那么它的样板和维护就太多了。 但是,感谢兄弟;) –