Javascript 概括类型化setter和getter的最佳方法是什么?

Javascript 概括类型化setter和getter的最佳方法是什么?,javascript,ecmascript-6,Javascript,Ecmascript 6,概括此类中的setter和getter的最佳方法是什么: class A { constructor() { this._foo = new Foo(); this._bar = new Bar(); } get foo() { return this._foo; } set foo(value) { if (value instanceof Foo) this._

概括此类中的setter和getter的最佳方法是什么:

class A {
    constructor() {
        this._foo = new Foo();
        this._bar = new Bar();
    }

    get foo() {
        return this._foo;
    }

    set foo(value) {
        if (value instanceof Foo)
            this._foo = value;
        else
            this._foo = Object.assign(new Foo(), value);
    }

    get bar() {
        return this._bar;
    }

    set bar(value) {
        if(value instanceof Bar)
            this._bar = value;
        else
            this._bar = Object.assign(new Bar(), value);
    }
}
编辑

是的,这个问题可以是基于意见的,也可以用打字语言来解决。但是如何在es6中解决现有项目中没有迁移选项的问题呢

在反序列化保存在数据库中的json文档后,我需要此setters来定义成员的类型:

{
    "foo" :{"x":0,"y":0,"z":0},
    "bar" : {"propA": "valueA", "propB": "valueB"}
}
从理论上讲,您可以使用mixin:

 const Typed = (key, type, parent = class {}) => class Typed extends parent {
   constructor(...props) {
    super(...props);
     this[`_${key}`] = new type();
   }

  get [key]() { return this[`_${key}`]; }

  set [key](value) { 
      this[`_${key}`] = value instanceof type ? value : Object.assign(new type, value);
  }
}

const A = Typed("foo", Foo, Typed("bar", Bar, class {
 //...
});
但是您可能根本不应该使用getter/setter,而是应该修复试图使用无效值设置属性的代码。

理论上,您可以使用mixin:

 const Typed = (key, type, parent = class {}) => class Typed extends parent {
   constructor(...props) {
    super(...props);
     this[`_${key}`] = new type();
   }

  get [key]() { return this[`_${key}`]; }

  set [key](value) { 
      this[`_${key}`] = value instanceof type ? value : Object.assign(new type, value);
  }
}

const A = Typed("foo", Foo, Typed("bar", Bar, class {
 //...
});

但是您可能根本不应该使用getter/setter,而是应该修复试图使用无效值设置属性的代码。

如果您想抽象setter/getter的创建,当然可以编写一个函数来实现这一点:

function typedAccessor(obj, name, type, internal) {
    Object.defineProperty(obj, name, {
        get() {
            return this[internal];
        },
        set(val) {
            if (val instanceof type)
                this[internal] = val;
            else
                this[internal] = Object.assign(new type, val);
        }
    });
}

class A {
    constructor() {
        this._foo = new Foo();
        this._bar = new Bar();
    }
}
typedAccessor(A.prototype, "foo", Foo, "_foo");
typedAccessor(A.prototype, "bar", Bar, "_bar");
然而,我希望避免这种模式

我需要这个setters在反序列化json文档后定义成员的类型

与使用Object.assign相比,最好使用知道如何处理JSON表示的自定义静态方法,并希望所有内容都有适当的setter。这使您能够更好地控制序列化/反序列化过程,并使类更简单,样板代码更少

class A {
    constructor(foo, bar) {
        this.foo = foo;
        this.bar = bar;
    }
    static fromJSON(val) {
        return new this(Foo.fromJSON(val.foo), Bar.fromJSON(val.bar);
    }
}

如果要抽象setter/getter的创建,当然可以编写一个函数:

function typedAccessor(obj, name, type, internal) {
    Object.defineProperty(obj, name, {
        get() {
            return this[internal];
        },
        set(val) {
            if (val instanceof type)
                this[internal] = val;
            else
                this[internal] = Object.assign(new type, val);
        }
    });
}

class A {
    constructor() {
        this._foo = new Foo();
        this._bar = new Bar();
    }
}
typedAccessor(A.prototype, "foo", Foo, "_foo");
typedAccessor(A.prototype, "bar", Bar, "_bar");
然而,我希望避免这种模式

我需要这个setters在反序列化json文档后定义成员的类型

与使用Object.assign相比,最好使用知道如何处理JSON表示的自定义静态方法,并希望所有内容都有适当的setter。这使您能够更好地控制序列化/反序列化过程,并使类更简单,样板代码更少

class A {
    constructor(foo, bar) {
        this.foo = foo;
        this.bar = bar;
    }
    static fromJSON(val) {
        return new this(Foo.fromJSON(val.foo), Bar.fromJSON(val.bar);
    }
}

一点也不需要它们,使用某种类型的系统类型脚本,流…我不知道你说的类型是什么意思,或者你说的泛化是什么意思…在接近票数的情况下获得扳机的喜悦,嗯?这篇文章可以很容易地通过询问OP来澄清。让人们冷静下来。你想做什么吗?你想实现什么?您是否试图为setX创建一个自动模板,该模板在调用时运行相同的逻辑检查参数的类型是否正确,根据结果采取行动?根本没有这些模板,使用某种类型的系统类型脚本,流…我不知道你所说的键入是什么意思,或者你所说的概括是什么意思…在接近票数的情况下,你会高兴吗?这篇文章可以很容易地通过询问OP来澄清。让人们冷静下来。你想做什么吗?你想实现什么?您是否试图为setX创建一个自动模板,该模板在调用时运行相同的逻辑检查参数的类型是否正确,根据结果执行操作?我不会说设置无效值的代码一定会被破坏。我有理由拥有它。再说一次,我不知道这是一个设计决策还是一个事后修正。如果是后者,那么解决方案确实是修复它,甚至可能在系统中引入类型检查。我需要在反序列化保存在数据库中的json文档后设置成员的类型。我不会说设置无效值的代码一定被破坏了。我有理由拥有它。再说一次,我不知道这是一个设计决策还是一个事后修正。如果是后者,那么解决方案确实是修复它,甚至可能在系统中引入类型检查