Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用facebook/immutable js创建自定义的不可变类型?_Javascript_Immutability_Immutable.js - Fatal编程技术网

Javascript 如何使用facebook/immutable js创建自定义的不可变类型?

Javascript 如何使用facebook/immutable js创建自定义的不可变类型?,javascript,immutability,immutable.js,Javascript,Immutability,Immutable.js,我试图创建一个简单的不可变区间类型。它有一个开始和结束属性。有没有一种简单的方法可以利用库创建您自己的自定义不可变类型 我目前尝试将包含模式与Immutable.Map和Immutable.List一起使用,但效果不佳difference应该返回一个不可变的间隔列表,但是由于它创建了间隔的新实例,所以它返回的列表不会传递相等值 我感觉我采取了错误的方法,但我不知道如何。我可以很容易地用Immutable.Map表示数据,但我希望在其公共界面中包含差异,而不包括get和set等常规Map方法。i、

我试图创建一个简单的不可变区间类型。它有一个开始和结束属性。有没有一种简单的方法可以利用库创建您自己的自定义不可变类型

我目前尝试将包含模式与Immutable.Map和Immutable.List一起使用,但效果不佳<例如,code>difference应该返回一个不可变的间隔列表,但是由于它创建了间隔的新实例,所以它返回的列表不会传递相等值

我感觉我采取了错误的方法,但我不知道如何。我可以很容易地用
Immutable.Map
表示数据,但我希望在其公共界面中包含
差异
,而不包括get和set等常规
Map
方法。i、 我希望它是不可变的,同时也是具有自己接口的自己的类型

var Immutable = require('immutable')

function Interval(start, end) {
  this.value = Immutable.Map({
    start: start,
    end: end
  })
}

Interval.prototype.start = function () {
  return this.value.get('start')
}

Interval.prototype.end = function () {
  return this.value.get('end')
}

Interval.prototype.equals = function(interval) {
  return this.value.equals(interval.value)
}

Interval.prototype.difference = function (subtrahend) {
  var nonoverlapping = subtrahend.start() > this.end() || subtrahend.end() < this.start()

  return nonoverlapping ? Immutable.List.of(this) :
    Immutable.List.of(
      new Interval(this.start(), subtrahend.start()),
      new Interval(subtrahend.end(), this.end())
    )
    .filter(function(interval) {
      return interval.end() > interval.start()
    })
}

为什么不使用
记录
类型:

var Interval=Immutable.Record({start:0,end:1})

这将为您创建记录类型,分别使用默认值0和1定义
start
end
属性

现在要创建
Interval
的实例,只需执行以下操作:

var newInterval = new Interval() //will have default values above
var newInterval = new Interval({start: 10, end: 30)
请注意,
Record
type的实例只是值类型,因此它们应该只包含数据。当然,您可以定义对该数据值进行操作的函数

var difference = function (interval1, interval2) {
  var nonoverlapping = interval2.start > interval1.end || interval2.end < interval1.start

  return nonoverlapping ? Immutable.List.of(interval1) :
    Immutable.List([
      new Interval({start: interval1.start, end: interval2.start}),
      new Interval({start: interval2.end, end: interval1.end})
    ])
    .filter(function(interval) {
      return interval.end > interval.start
    });
}
var差=函数(间隔1,间隔2){
变量不重叠=interval2.start>interval1.end | | interval2.endinterval.start
});
}
使用
Immutable.is(interval1,interval2)

有关记录类型的详细信息:

您可以使用

那么很容易:

const {Map} = require('extendable-immutable');

class Interval extends Map {
    constructor(start, end) {
        super({
            value: new Map({start: start, end: end})
        });
    }

    start() {
        return this.get('value').get('start');
    }

    end() {
        return this.get('value').get('end');
    }

    //...
}
如果您选择方法(如开始、结束)而不是像我这样的字段,我不建议使用Record。如果您使用记录实现它,您将拥有自动公开的字段

您可能希望使用
\u value
字段创建记录自定义类,而不是公开
字段,但这并不总是可行的。见:


执行方法
valueOf

例如:

Interval.prototype.valueOf = function() {
  return Map({ class: Interval, value: this.value });
}
在测试中:

Immutable.is(new Interval(80, 90), new Interval(80, 90)); // true

另一个选项是通过实现方法
equals
hashCode
(使用函数
Immutable.is
Immutable.hash
)将类转换为a

Immutable.is(new Interval(80, 90), new Interval(80, 90)); // true