Можно ли сделать объект нулевым или неопределенным через указатель? - PullRequest
0 голосов
/ 01 января 2019
let person = {name: "Annah", age: 18};
let pointer = person;
pointer = undefined;

человек не становится неопределенным, только указатель?

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Вы можете эмулировать это поведение, используя обертывающий объект:

const reference = value => ({ 
  value,
  free() { this.value = undefined },
});

const val = ref => ref.value;

let person = reference({name: "Annah", age: 18});
let pointer = person;

console.log(val(person));

pointer.free();

console.log(val(person));

Благодаря тому, что вы больше не можете получить доступ к person.name, вы должны разыменовать его, используя val(person).name.


Теоретически вы можете создать двапеременные, ссылающиеся на одно и то же:

with({ 
 person: undefined,
 get pointer() { return this.person; },
 set pointer(value) { this.person = value },
}) {
  person = { some: "test" };
  console.log(pointer);
  pointer = undefined;
  console.log(person);
}

Но, пожалуйста, не делайте этого (кроме веселья).

0 голосов
/ 05 января 2019

Начиная с ES6, в javascript нет указателей, но для этого есть обходной путь ...

Класс указателя:

/****
USAGE: 
var a = 3;
var b = new Pointer("a")
b.value = 1
console.log(a) // Logs "1"
****/






class Pointer{
  constructor(str){ // Called when "new Pointer()"
    this.var = str // Assign Pointer.var to the string
    this._value = window[str]
  }
  
  set value(value){
    window[this.var] = value
    this._value = value
  }
  
  get value(){
    return window[this.var]
  }
  changeLocation(str){
    this.constructor(str)
  }
  delete(){
    delete window[this.var]
  }
  
}

Пример

// Put the Pointer Class HERE
var person = {name: "Annah", age: 18}; // Notice that let => var as Pointer cannot access lets and consts
var pointer = new Pointer("person"); // Pointer to person
pointer.value = undefined; // Sets value to undefined
// OR:
pointer.delete() // Deletes it permanently
0 голосов
/ 01 января 2019

Создайте объект для хранения ваших записей и доступа к ним через их идентификаторы.Например, используя name в качестве идентификатора:

const people = {};
const person = { name: "Annah", age: 18 };

people[person.name] = person;

console.info(people[person.name]);  // Annah is there

delete people[person.name];

console.info(people[person.name]);  // undefined - Annah is gone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...