Как сделать прототип конструктора перечислимым?

#javascript

#javascript

Вопрос:

Как я могу сделать prototype getTaggedTweet перечислимым, чтобы никто не мог получить доступ к этому прототипу извне? Могу ли я сделать это, используя метод defineProperty объекта?

 function Tweet_api(tweetID){}
Tweet_api.prototype.getTweetByHandler = async function(){
    const data = await this.getTaggedTweet.call(null, 'handler');
    return data;
};
Tweet_api.prototype.getTweetByHashtag = async function(){
    const data = await this.getTaggedTweet.call(null, 'hashtag');
    return data;
};
Tweet_api.prototype.getTaggedTweet = function(method){
    return method === 'handler' ? '@' : '#';
}  

Ответ №1:

Если свойство сделать перечислимым или неперечисляемым, это не повлияет на то, доступно оно извне или нет. Если это свойство, оно будет доступно независимо с помощью Object.getOwnPropertyNames , которая также выполняет итерации по неперечисляемым свойствам.

 const obj = {};
Object.defineProperty(obj, 'amIPrivate', {
  value: 'no',
  enumerable: false
});

Object.getOwnPropertyNames(obj).forEach((prop) => {
  console.log(obj[prop]);
});  

Скорее, вы можете убедиться, что внешняя сторона не сможет получить доступ к вашему методу с помощью замыкания — создайте IIFE, который определяет класс и (частную, автономную) функцию внутри него, затем верните класс:

 const Tweet_api = (() => {
  function Tweet_api(tweetID) {}
  Tweet_api.prototype.getTweetByHandler = async function() {
    const data = await getTaggedTweet.call(null, 'handler');
    return data;
  };
  Tweet_api.prototype.getTweetByHashtag = async function() {
    const data = await getTaggedTweet.call(null, 'hashtag');
    return data;
  };
  const getTaggedTweet = method => method === 'handler' ? '@' : '#';
  return Tweet_api;
})();
  

Также обратите внимание, что нет необходимости в await вещах, которые не являются Promises.