Конечная проблема с использованием this
вместо prototype
заключается в том, что при переопределении метода конструктор базового класса все равно будет ссылаться на переопределенный метод. Рассмотрим это:
BaseClass = function() {
var text = null;
this.setText = function(value) {
text = value + " BaseClass!";
};
this.getText = function() {
return text;
};
this.setText("Hello"); // This always calls BaseClass.setText()
};
SubClass = function() {
// setText is not overridden yet,
// so the constructor calls the superclass' method
BaseClass.call(this);
// Keeping a reference to the superclass' method
var super_setText = this.setText;
// Overriding
this.setText = function(value) {
super_setText.call(this, "SubClass says: " + value);
};
};
SubClass.prototype = new BaseClass();
var subClass = new SubClass();
console.log(subClass.getText()); // Hello BaseClass!
subClass.setText("Hello"); // setText is already overridden
console.log(subClass.getText()); // SubClass says: Hello BaseClass!
по сравнению с:
BaseClass = function() {
this.setText("Hello"); // This calls the overridden method
};
BaseClass.prototype.setText = function(value) {
this.text = value + " BaseClass!";
};
BaseClass.prototype.getText = function() {
return this.text;
};
SubClass = function() {
// setText is already overridden, so this works as expected
BaseClass.call(this);
};
SubClass.prototype = new BaseClass();
SubClass.prototype.setText = function(value) {
BaseClass.prototype.setText.call(this, "SubClass says: " + value);
};
var subClass = new SubClass();
console.log(subClass.getText()); // SubClass says: Hello BaseClass!
Если вы считаете, что это не проблема, это зависит от того, можете ли вы жить без частных переменных и достаточно опытный, чтобы узнать утечку, когда вы ее видите. Кроме того, необходимость поставить логику конструктора после определения методов неудобна.
var A = function (param1) {
var privateVar = null; // Private variable
// Calling this.setPrivateVar(param1) here would be an error
this.setPrivateVar = function (value) {
privateVar = value;
console.log("setPrivateVar value set to: " + value);
// param1 is still here, possible memory leak
console.log("setPrivateVar has param1: " + param1);
};
// The constructor logic starts here possibly after
// many lines of code that define methods
this.setPrivateVar(param1); // This is valid
};
var a = new A(0);
// setPrivateVar value set to: 0
// setPrivateVar has param1: 0
a.setPrivateVar(1);
//setPrivateVar value set to: 1
//setPrivateVar has param1: 0
по сравнению с:
var A = function (param1) {
this.setPublicVar(param1); // This is valid
};
A.prototype.setPublicVar = function (value) {
this.publicVar = value; // No private variable
};
var a = new A(0);
a.setPublicVar(1);
console.log(a.publicVar); // 1
Если Вы имеете систему Linux в наличии для Вас использование wget:
wget -k -K -E -r -l 10 -p -N -F -nH http://website.com/
Опции
Источник: блог
Jean-Pascal HoudeЯ сделал это в прошлом путем добавления:
ob_start();
В вершине страниц и затем в нижнем колонтитуле:
$page_html = ob_get_contents();
ob_end_clean();
file_put_contents($path_where_to_save_files . $_SERVER['PHP_SELF'], $page_html);
Вы могли бы хотеть преобразовать .php расширения .html прежде, чем испечь HTML в файлы. Если необходимо генерировать несколько страниц с переменными, одна довольно легкая опция состоит в том, чтобы добавить имя файла с md5sum всех, ПОЛУЧАЮТ переменные, просто необходимо изменить их в HTML также. Таким образом, можно преобразовать:
somepage.php?var1=hello&var2=hullo
кому:
somepage_e7537aacdbba8ad3ff309b3de1da69e1.html
ужасный, но работы.
Иногда можно использовать PHP для генерации JavaScript для эмуляции некоторых функций, но это не может быть автоматизировано очень легко.
создайте свой сайт, затем используйте инструмент зеркального отражения как wget или lwp-зеркало для захвата статической копии
Создайте сайт как нормальный, затем используйте программное обеспечение глобального поиска для генерации копии HTML.
HTTrack является программным обеспечением, которое я использовал прежде.
При использовании modx, он имеет созданный в функции для экспорта статических файлов.
Один способ сделать это должно создать сайт в PHP как нормальный, и иметь сценарий, на самом деле захватывают веб-страницы (через HTTP - можно использовать wget или записать другой сценарий PHP, который просто использует файл () с URL), и сохраните их к местоположениям общедоступного сайта, когда Вы "сделаны". Затем можно просто запустить скрипт снова, когда Вы решаете изменить страницы снова. Этот метод довольно полезен, когда у Вас есть медленно изменяющаяся база данных и большой трафик, поскольку можно устранить все SQL-запросы на живом сайте.
Кроме того, к wget Вы могли использовать (Win|Web) HTTrack ( Веб-сайт ) для захвата статической страницы. HTTrack даже исправляет ссылки на файлы и документы для соответствия статическому выводу.
Если у Вас есть многие страницы со всеми видами переменных запроса и этажерки, вероятно, один из глобального поиска оснащает других комментаторов, упомянули (wget, lwp-зеркало, и т.д.) было бы самым легким и большая часть надежного решения.
Однако, если число страниц необходимо добраться, является низким, или по крайней мере управляемые , у Вас есть несколько опций, которые не требуют никаких сторонних инструментов (не, что необходимо обесценить их ПРОСТО, потому что они - третье лицо).
можно использовать php на командной строке, чтобы заставить это производить непосредственно в файл.
php myFile.php > myFile.html
Используя этот метод мог стать болезненным (хотя Вы могли поместить все это в сценарий оболочки), и это не позволяет Вам передавать переменные таким же образом (например: php myFile.php?abc=1
не будет работать).
Вы могли использовать другой файл PHP в качестве сценария "сборки", который содержит список всех URL, которые Вы хотите, и затем захватывает их через file_get_contents()
или file()
и пишет им в локальный файл. Используя этот метод, можно также заставить это проверять, изменился ли файл (md5_file()
, должен работать на тот), таким образом, Вы будете знать, что дать Вашему клиенту, должны они только хотеть обновления.
в дополнение к № 2 перед записью вывода в файл просканируйте его для локальных URL и затем добавьте URL к списку файлов для загрузки. В то время как Вы там, изменяете те URL для соединения с тем, что Вы в конечном счете назовете своим выводом, таким образом, у Вас будет функционирующая сеть в конце. Предупреждение здесь - если это звучит хорошим, Вы могли бы, вероятно, использовать один из инструментов, которые уже существуют и делают это для Вас.
Я делаю это на своем собственном веб-сайте об определенных страницах, которые, как гарантируют, не изменятся - я просто выполняю сценарий оболочки, который мог быть вскипячен к (предупреждение: колотите псевдокод):
find site_folder -name \*.static.php -print -exec Staticize {} \;
с Staticize тем, чтобы быть:
# This replaces .static.php with .html
TARGET_NAME="`dirname "$1"`/"`basename "$1" .static.php`".html
php "$1" > "$TARGET_NAME"
wget является, вероятно, самым полным методом. Если у Вас нет доступа к этому, и у Вас есть основанное на шаблоне расположение, можно хотеть изучить использование Ученого 3. Я рекомендую Ученому 3 высоко по другим шаблонным системам как Присяжный острослов.
Ученый является очень легким весом и использует PHP в качестве шаблонного языка, не некоторый собственный подъязык. Команда, которую Вы хотели бы искать, является выборкой (), который "скомпилирует" Ваш шаблон и поместит его в переменную, которую можно произвести.