JavaScript — Как вызвать функцию прототипа из другой функции (не прототипа)?

#javascript #jquery #firebase #firebase-realtime-database #prototype

# #javascript #jquery #firebase #firebase-realtime-база данных #прототип

Вопрос:

Я хочу вызвать текущую функцию прототипа экземпляра из динамически созданной функции, но я не могу этого сделать. Я использую пример дружественного чата Google Firebase.

Вот файл JS.

 // Initializes FriendlyChat.
var chat = "test";

function FriendlyChat() {
  this.checkSetup();
  $("#l_chat").html("");
  this.initFirebase();


//LOAD ALL CHATs
this.database1 = firebase.database();

this.messagesRef1 = this.database1.ref('messages/');

this.messagesRef1.on("child_added", function(snapshot, prevChildKey)        {
 var newPost = snapshot.val();
  console.log(newPost);
 var name1 = String(snapshot.key);
 document.getElementById("l_chat").innerHTML   = '<button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-color-text--white" onclick="click1(''   name1   '');"><i class="material-icons">chat</i><span>'  
 snapshot.key   '</span></button><br/>';
});



}

// Sets up shortcuts to Firebase features and initiate firebase auth.
FriendlyChat.prototype.initFirebase = function() {
  // Shortcuts to Firebase SDK features.
  this.auth = firebase.auth();
  this.database = firebase.database();
  this.storage = firebase.storage();
  // Initiates Firebase auth and listen to auth state changes.
  this.auth.onAuthStateChanged(this.onAuthStateChanged.bind(this));
};
// Loads chat messages history and listens for upcoming ones.
FriendlyChat.prototype.loadMessages = function() {
this.messagesRef = this.database.ref('messages/'   chat);

  // Make sure we remove all previous listeners.
  this.messagesRef.off();
  $("#messages").html("");
  // Loads the last 15 messages and listen for new ones.
  var setMessage = function(data) {
    var val = data.val();
    this.displayMessage(data.key, val.name, val.text, val.photoUrl, val.imageUrl);
  }.bind(this);
  this.messagesRef.limitToLast(15).on('child_added', setMessage);
  this.messagesRef.limitToLast(15).on('child_changed', setMessage);
};


function click1(name) {
chat = name;
console.log ('test works '   chat);
this.loadMessages(); // here is the problem!!!!
};



window.onload = function() {
  window.friendlyChat = new FriendlyChat();
};
 

Итак, как вы можете видеть, я динамически создаю click1 функцию, и я хочу, когда я нажимаю на объект, чтобы перезагрузить сообщения, к которым я хочу получить доступ FriendlyChat.prototype.loadMessages .

Что я уже пробовал?

 this.loadmessages();
 

и

 FriendlyChat.prototype.loadMessages();
 

Но они не работают. Есть ли какой-нибудь способ сделать это?

Комментарии:

1. Может window.friendlyChat.loadMessages() быть?

2. @rbntd вам почти никогда не нужно ссылаться на объект window, так как вы можете получить доступ к его содержимому из области видимости globak. окно. a равно a

3. Ваша реальная проблема заключается в использовании встроенных атрибутов обработчика событий html, которые могут вызывать только глобальные функции (например friendly1 ). Используйте надлежащий прослушиватель событий и закрытие.