Javascript конструкторы - когда возникают ошибки? - PullRequest
1 голос
/ 02 июля 2019

Нello!В javascript практически любое значение может успешно получить его constructor:

console.log((33).constructor); // Number
console.log((false).constructor); // Boolean
console.log(('hello').constructor); // String
console.log(({}).constructor); // Object
console.log(([]).constructor); // Array
console.log((v => v).constructor); // Function

Я также знаю, что вы можете создать класс, экземпляры которого не будут иметь свойства constructor:

let O = function(){};
O.prototype = Object.create(null);
console.log((new O()).constructor)); // undefined

Что меня здесь интересует, так это значения, которые вызывают ошибки при попытке получить их конструкторы.Мне известны только два таких значения:

console.log((null).constructor); // TypeError!
console.log((undefined).constructor); // TypeError!

Мой вопрос: Являются ли null и undefined единственными двумя возможными значениями с таким поведением?

1 Ответ

4 голосов
/ 02 июля 2019

Мой вопрос: являются ли значения null и undefined единственными двумя возможными значениями с таким поведением?

По умолчанию да, потому что если свойство не существует в объекте или любом другомиз его прототипов вы получаете значение undefined.Причина null и undefined в том, что вы не можете получить свойства от них.Это единственные вещи, которые ведут себя таким образом, когда вы пытаетесь получить от них свойства.

Однако любой объект может быть сделан , чтобы выдать ошибку, когда вы получите свойство constructorлибо напрямую:

const o = {
  get constructor() {
    throw new Error("Don't do that!");
  }
};
console.log(o.constructor);

или использование прокси, где ловушка предотвращает это:

const o = new Proxy({}, {
  get(target, propName, receiver) {
    if (propName === "constructor") {
      throw new Error("Don't do that!");
    }
    return Reflect.get(target, propName, receiver);
  }
});
console.log(o.constructor);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...