Вы можете создать способ определения статических констант в классе с использованием нечетной функции классов ES6. Поскольку statics наследуются по своим подклассам, вы можете сделать следующее:
const withConsts = (map, BaseClass = Object) => {
class ConstClass extends BaseClass { }
Object.keys(map).forEach(key => {
Object.defineProperty(ConstClass, key, {
value: map[key],
writable : false,
enumerable : true,
configurable : false
});
});
return ConstClass;
};
class MyClass extends withConsts({ MY_CONST: 'this is defined' }) {
foo() {
console.log(MyClass.MY_CONST);
}
}
Существует полный набор инструкции по MSDN также. Необходимо считать их хорошо, это и хитро и важно.
Несколько точек я нашел самым полезным:
Типы Значения не имеют Идентификационных данных, таким образом, в struct Point
Вы будете обычно делать, участник участником выдерживает сравнение.
Ссылочные типы обычно имеют идентификационные данные, и поэтому Равняется тесту, обычно останавливается в ReferenceEquals (значение по умолчанию, никакая потребность переопределить). Но существуют исключения, как строка и Ваш class Point2
, где объект не имеет никаких полезных идентификационных данных, и затем Вы переопределяете участников Равенства для обеспечения собственной семантики. В той ситуации следуйте инструкциям для прохода через пустой указатель и случаи другого-типа сначала.
И существуют серьезные основания сохранить GethashCode()
и operator==
в синхронизации также.
В том, который берет obj, если тип obj является Point2, звонят, конкретный тип Равняется. В конкретном типе Равняется, удостоверьтесь, что у всех участников есть то же значение.
public override bool Equals ( object obj )
{
return Equals(obj as Point2);
}
public bool Equals ( Point2 obj )
{
return obj != null && obj.X == this.X && obj.Y == this.Y ...
// Or whatever you think qualifies as the objects being equal.
}
, вероятно, необходимо переопределить GetHashCode также, чтобы удостовериться, что возражает, что "равны", имеют тот же хэш-код.
Вероятный Вы хотите к и , переопределение Равняется (возражают) и определяют, Равняется (MyType), потому что последний старается не упаковывать. И переопределите оператор равенства.
книга Инструкций по Платформе.NET (2-й редактор) имеет больше покрытия.
Lie Daniel L сказал,
public override bool Equals(object obj) {
Point2 point = obj as Point2; // Point2? if Point2 is a struct
return point != null && this.Equals(point);
}
public bool Equals(Point2 point) {
...
}
public override bool Equals ( object obj )
{
// struct
return obj is Point2 && Equals ( ( Point2 ) value );
// class
//return Equals ( obj as Point2 );
}
public bool Equals ( Point2 obj )