0

介绍

为了获取类实例的属性,我们可以使用Object.getOwnPropertyNames()以下示例中的方法

class People {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }    
  getProperties() {
    return Object.getOwnPropertyNames(this);
  }
}
console.log(new People("John", 20).getProperties())

这确实有效,因为对象的属性是public。但如果对象的属性是私有的,则此方法不起作用。

问题

想象一下,您不希望用户直接在类方法之外修改nameandage属性,因此您将它们设为私有。但是,您还希望有一种方法可以在另一个实例中复制一个实例。由于不适用于私有属性,因此您无法访问密钥以使:Object.getOwnPropertyNames()clone()

class People {
  #name; #age;
  constructor(name, age) {
    this.#name = name;
    this.#age = age;
  }
  clone(o) {
    Object.getOwnPropertyNames(this).forEach(key => this[key] = o[key]);
  }
  getName() { return this.#name }
}

p1 = new People("John", 20);
p2 = new People("", 0);

p2.clone(p1);   // Now p2 should have the same properties of p1

console.log(p2.getName());      // Prints "" and should print "John"

问题

有没有办法从类方法内部访问类的私有属性名称?

4

2 回答 2

0

是的。您可以使用名为WeakMaps. 你会做这样的事情:

const _name = new WeakMap();
const _age = new WeakMap();

class Person {
    constructor(name, age) {
        _name.set(this, name);
        _age.set(this, age);
    }
}

如您所见,我们使用该set方法为特定类设置weakMap的值。

现在,要在另一种方法中访问此值,请使用以下get方法:

const _name = new WeakMap();
const _age = new WeakMap();

class Person {
    constructor(name, age) {
        _name.set(this, name);
        _age.set(this, age);
    }

    getName() {
        return _name.get(this);
    }
}

const bob = new Person('Bob', 35); // You will not be able to access the name property by typing "bob.name".
console.log(bob.getName());

get方法将允许您访问所提到的类的那个weakMap 的值。

有关 WeakMaps 的更多信息,请单击此处

于 2021-08-18T23:08:32.867 回答
-1

只需实现返回所需参数的方法:

getParameters(){
    return { name: this.#name, age: this.#age };
}    

并在clone()方法中使用如下:

clone(o) {
   const { name, age } = o.getParameters();
   this.name = name;
   this.age = age;
}

所以你只能通过它的方法访问对象的私有参数。如果您想要一个更通用的方法,而不列出所有参数,您可以在方法中使用Object.entries()方法getParameters()

于 2021-08-18T23:08:34.123 回答