Как говорили другие, первая версия, используя «this», приводит к каждому экземпляру класса A, имеющему собственную независимую копию метода функции «x». Принимая во внимание, что использование «прототипа» будет означать, что каждый экземпляр класса A будет использовать одну и ту же копию метода «x».
Вот некоторый код, чтобы показать эту тонкую разницу:
// x is a method assigned to the object using "this"
var A = function () {
this.x = function () { alert('A'); };
};
A.prototype.updateX = function( value ) {
this.x = function() { alert( value ); }
};
var a1 = new A();
var a2 = new A();
a1.x(); // Displays 'A'
a2.x(); // Also displays 'A'
a1.updateX('Z');
a1.x(); // Displays 'Z'
a2.x(); // Still displays 'A'
// Here x is a method assigned to the object using "prototype"
var B = function () { };
B.prototype.x = function () { alert('B'); };
B.prototype.updateX = function( value ) {
B.prototype.x = function() { alert( value ); }
}
var b1 = new B();
var b2 = new B();
b1.x(); // Displays 'B'
b2.x(); // Also displays 'B'
b1.updateX('Y');
b1.x(); // Displays 'Y'
b2.x(); // Also displays 'Y' because by using prototype we have changed it for all instances
Как отмечали другие, существуют разные причины выбора одного или другого метода. Мой образец просто предназначен, чтобы четко продемонстрировать разницу.
На самом деле можно активироваться трассировка в Панели управления Java. Это передаст по каналу что-либо, что заканчивается в консоли Java в файле трассировки.
файлы журнала закончатся в:
(Если можно изменить код), можно установить System.out
поле к другому значению:
System.setOut(new PrintStream(new FileOutputStream(fileName)));
при выполнении сценария (вызывающий программу через java
) от Unix
, Вы могли сделать:
/path/to/script.sh >& path/to/output.log
Замороженная консоль, вероятно, означает мертвую блокировку (это могло также означать повторенный бросок исключения). Можно получить дамп стека с помощью jstack
. jps
может сделать нахождение процесса легче.