Почему я могу получить доступ к объектам, которые не были объявлены в файле? Только занятия были экспортированыJavascript

Форум по Javascript
Ответить
Anonymous
 Почему я могу получить доступ к объектам, которые не были объявлены в файле? Только занятия были экспортированы

Сообщение Anonymous »

Итак, я в настоящее время изучаю ESM, и я занимался практикой, экспортируя и импортировав два класса. В файле, где я создал классы, я также создал два объекта, которые являются экземплярами этих классов. Во втором файле я импортировал оба класса, но не в экземпляры, я затем скопировал и вставил код из первого файла в второй, чтобы проверить, импортировали ли классы, и я забыл, что я не экспортировал экземпляры, но он все еще работал. Вот первый файл. < /P>
//tests.js (file one)

export class Person{
#age;
constructor(name, age){
this._name = name;
this.#age = age;
}

get name(){
return this._name;
}

intro(){
console.log(`My name is ${this._name} and I am ${this.#age} years old`);
}

set changeName(newName){
if(newName.length < 3 && typeof newName === 'string'){
console.log('ERROR: Name cannot be less than 3 characters (Name remains unchanged)');
return;
}
this._name = newName;
}

get age(){
return this.#age;
}

birthday(){
this.#age++;
}

};

export default class Safe{
#owner;
#secret;
#code;
constructor(secret, code, owner){
this.#secret = secret;
this.#code = code;
this.#owner = owner;
}

getSecret(code){
if(code !== this.#code){
console.log('!INCORRECT CODE!');
return;
}

console.log(this.#secret);
}

get ownerHint(){
return `Owner first two letters -> ${this.#owner[0]}${this.#owner[1]}`
}

changeCode(newCode, owner){
if(owner[0] !== this.#owner[0]){
console.log(`ERROR: OWNER VERIFICATION FAILED`);
return;
}

this.#code = newCode;

}

}

const secret = new Safe('I have a cat!', 2818, 'Sam');

console.log(secret.ownerHint);
secret.getSecret(2818);
secret.changeCode(2817, 'Sam');
secret.getSecret(2817);

const sam = new Person('Sam', 21);
console.log(sam.age);
console.log(sam.name);
sam.intro();
sam.changeName= 'Sammy';
sam.birthday();
console.log(sam.age);
sam.intro();
< /code>
Вот второй файл (файл я импортировал оба класса): < /p>
//test2.js

import Safe, { Person } from "./tests.js"

const newSafe = new Safe('I have a cat!', 2818, 'Sam');
const newPerson = new Person('Sam', 17);

//here is where the error is made, but for some reason IT WORKS?
//the sam and secret instances are only declared in the tests.js file

console.log(secret.ownerHint);
secret.getSecret(2818);
secret.changeCode(2817, 'Sam');
secret.getSecret(2817);

console.log(sam.age);
console.log(sam.name);
sam.intro();
sam.changeName = 'Sammy';
sam.birthday();
console.log(sam.age);
sam.intro();
< /code>
Как второй файл узнает о существовании экземпляра «SAM» и «Secret»? Теперь, еще более запутанно, чем это, заключается в том, что когда я запускаю второй файл (Node test2.js), код работает нормально, пока не достигнет точки, а затем он просто выбрасывает ссылочную ошибку: «Секрет не определяется» Вот выход < /p>
Owner first two letters -> Sa
I have a cat!
I have a cat!
21
Sam
My name is Sam and I am 21 years old
22
My name is Sammy and I am 22 years old
file:///home/javascript-projects/test2.js:8
console.log(secret.ownerHint);
^

ReferenceError: secret is not defined
< /code>
Как, черт возьми, это происходит от того, чтобы вывести все, что хорошо, как в экземплярах «секрет», так и в «SAM», а затем внезапно изменить свое мнение и бросить ошибку. Почему бы просто не бросить ошибку в первую очередь? О, и когда я набираю это, я пытался проверить, удалив весь код, за исключением синтаксиса импорта, и он все еще работал, за исключением случаев, когда он не бросал справочную ошибку.

Подробнее здесь: https://stackoverflow.com/questions/796 ... lasses-wer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»