#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.