У меня есть следующий код

(function() { var sayHello; sayHello = (function() { //add method to SayHello? SayHello.load = function() { var s = new SayHello(); return s; }; //SayHello constructor function SayHello() { this.text = "hello"; } //add method to SayHello SayHello.prototype.print = function(selector){ var elm = document.querySelector(selector); elm.innerHTML = this.text; }; return SayHello; })(); window.s = sayHello; })(); 

Я не понимаю, почему код работает при назначении функции «SayHello.load», но не «SayHello.prototype.load». И назначение функции для «SayHello.prototype.print» может работать, но для «SayHello.print» не может.

Я не понимаю, почему код работает при назначении функции «SayHello.load», но не «SayHello.prototype.load».

SayHello.load отличается от SayHello.prototype.load поскольку в первом случае вы добавляете свойство к объекту SayHello, а во втором добавляете его в прототип SayHello.

Итак, когда вы делаете

 var obj1 = new SayHello(); 

В первом случае ( SayHello.load ) у obj1 не будет свойства load, но во втором случае ( SayHello.prototype.load ) оно будет иметь.

Теперь это означает, что когда вы делали SayHello.load, вы в основном работали с переменной, инициализация которой была поднята до верха функции. Другими словами, переменная SayHello уже была инициализирована, но конструктор SayHello не был определен.

Вот почему вы не можете сделать SayHello.prototype.load раньше

 function SayHello() { this.text = "text"; } 

но вы можете сделать SayHello.load так как он не включает конструктор SayHello .