如何在javascript中由类和扩展类创建的对象之间进行引用?

时间:2019-02-22 00:06:42

标签: javascript ecmascript-6 es6-class

我创建了两个类:

class MyFirstClass {
    constructor(fname, lname, date) {
        this.fname = fname;
        this.lname = lname;
        this.date = date;
    }
}

class MySecondClass extends MyFirstClass {
    constructor(id, optionalArg) {
        super();
        this.id = id;
    }
}

然后创建两个这样的对象:

let myFirstObj = new MyFirstClass("foo", "bar", "today");
let mySecondObj = new MySecondClass(1234); //***(1234, optionalArg)

现在,有几种方法可以将属性从第一类实际传递给另一个(或从第一个obj传递到第二个),但是我所做的第二个对象都不引用第一个对象,它只是创建自己的属性“副本” 。所以当我这样做时:

mySecondObj.fname = "someothername";

第一个对象没有更改-它没有引用第二个对象(或者相反-也不起作用)。 我的问题是:如何解决在类上(或其中的类)之间的这种“对接”,以实际上相互引用新对象? 我想使其尽可能简单(这就是为什么我在第二堂课中留下了可选参数)。

2 个答案:

答案 0 :(得分:1)

这里尝试使用getset来维护两个对象之间的引用连接。

请参阅下文并阅读评论。

class MyFirstClass {
    constructor(fname, lname, date) {
        this.f_name = fname;
        this.f_name = lname;
        this.d = date;
        this.b = this;
       
    }
    
    set base(value){
        this.b = value;
        var a = this;
        
        Object.keys(this).forEach(function(key){
           if (a.b[key] != undefined)
               a[key] =a.b[key]
        });
    }
    
    set fname(value){
      this.f_name = this.b.f_name = value; 
    }
    
    get fname(){
      return this.f_name;
    }
    
    get lname(){
     return this.l_name; 
    }
    
    set lname(value){
      this.l_name =this.b.l_name= value; 
    }
    
    set date(value){
      this.d =this.b.d= value; 
    }
    
    get date(){
       return this.d;
    }
    
}

class MySecondClass extends MyFirstClass {
    constructor(id,base,optionalArg) {
        super();
        this.id = id;
         // chooce to have a reference to another object as base
         // now when you change either this or base class the both of them will change to
        if (base){
            this.base = base;
            base.b = this;
           }
    }
}

let myFirstObj = new MyFirstClass("foo", "bar", "today");
// myFirstObj is optional. 
let mySecondObj = new MySecondClass(1234, myFirstObj); //***(1234,base, optionalArg)

mySecondObj.fname = "test"

console.log(myFirstObj.fname)

答案 1 :(得分:0)

创建类继承并不意味着它们通过引用隐式共享值。因此,myfirstobj和mysecondobj将在内存中占据自己的空间,并且对它们中的任何一个所做的更改都不会自动更改其对应部分。