Каждый объект связан с прототипом объекта. При попытке получить доступ к объекту, который не существует, JavaScript будет выглядеть в объекте прототипа объекта для этого свойства и вернуть его, если он существует.
Свойство prototype
конструктора функции относится к объекту прототипа всех экземпляров, созданных с помощью этой функции при использовании new
.
В первом примере вы добавляете свойство x
в каждый экземпляр, созданный с помощью функции A
.
var A = function () {
this.x = function () {
//do something
};
};
var a = new A(); // constructor function gets executed
// newly created object gets an 'x' property
// which is a function
a.x(); // and can be called like this
Во втором примере вы добавляете свойство объекта-прототипа, к которому указывают все экземпляры, созданные с A
.
var A = function () { };
A.prototype.x = function () {
//do something
};
var a = new A(); // constructor function gets executed
// which does nothing in this example
a.x(); // you are trying to access the 'x' property of an instance of 'A'
// which does not exist
// so JavaScript looks for that property in the prototype object
// that was defined using the 'prototype' property of the constructor
В заключение, в В первом примере копия функции присваивается каждому экземпляру. Во втором примере одна копия функции используется всеми экземплярами.
Да, Devel:: Покрытие является способом пойти.
, Если Вы разрабатываете модуль и используете Модуль:: Сборка для управления установкой Вы даже имеете testcover
цель:
perl Build.PL
./Build testcover
, Который выполняет целый набор тестов и делает объединенный отчет о покрытии в хорошем HTML, где можно просмотреть модули и наблюдать их покрытие.
Как обычно, CPAN является Вашим другом: Взгляните на Devel:: Покрытие
Moritz обсуждает, как модули создали с Модулем:: Сборка может использовать Devel:: Покройте легко.
Для использования модулей ExtUtils:: MakeMaker, дополнительный модуль существует для вызова той же функциональности. Добавление следующего кода перед вызовом к WriteMakefile ():
eval "use ExtUtils::MakeMaker::Coverage";
if( !$@ ) {
print "Adding testcover target\n";
}
... позволит, для выполнения команды 'делает testcover' и имеет Devel:: Покрытие выполняет свое волшебство.
Как отмечено, Devel:: Покрытие является Вашим другом, но Вы захотите погуглить для него, также. Это - документация, немного редко и если Вы измените свою среду радикально, то необходимо будет переустановить его, потому что это создает Devel:: Покрытие:: Inc с набором информации вытянул от Вашей среды в то время, когда Вы устанавливаете его. Это вызвало много проблем для нас на работе, поскольку у нас есть общая среда CPAN и если один разработчик устанавливает Devel:: Покрытие и другой разработчик пытаются выполнить его, странный (и неправильный), результаты распространены.
при использовании этого модуля, также проверьте Devel:: CoverX:: Покрытый . Этот модуль получит большую часть информации который Devel:: Покрытие выбрасывает. Это очень удобно.