Windows XP (мог бы также работать над 2000), или более поздний Сценарий пакетной обработки:
@echo off
call :is_palindrome %1
if %ERRORLEVEL% == 0 (
echo %1 is a palindrome
) else (
echo %1 is NOT a palindrome
)
exit /B 0
:is_palindrome
set word=%~1
set reverse=
call :reverse_chars "%word%"
set return=1
if "$%word%" == "$%reverse%" (
set return=0
)
exit /B %return%
:reverse_chars
set chars=%~1
set reverse=%chars:~0,1%%reverse%
set chars=%chars:~1%
if "$%chars%" == "$" (
exit /B 0
) else (
call :reverse_chars "%chars%"
)
exit /B 0
Разница в том, что в последнем примере вы создаете статический метод, который не наследуется, если Пример
является функцией-конструктором. Определяя свойства в свойстве prototype
функции конструктора и создавая объекты с помощью ключевого слова new
, вновь созданные объекты наследуют прототип конструктора и, таким образом, получают доступ к этим методам. 1225] Примером могут служить методы, определенные во встроенных конструкторах ядра, такие как String
.. вновь созданные строки имеют метод indexOf
, потому что он был определен в String
прототип конструктора функции
typeof String.prototype.indexOf // 'function'
var name = 'John';
alert( name.indexOf('J') ) // 0
Приведенный ниже код создает конструктор функции, сначала мы определяем статический метод, создаем объект, выясняем, что у объекта нет метода getName, затем мы определяем его в прототипе и обнаруживаем, что теперь у объекта есть метод getName.
function Name(name) {
this.name = name;
};
Name.getName = function(){};
var john = new Name();
typeof john.getName // undefined
var john = new Name();
Name.prototype.getName = function(){ alert( this.name )};
typeof john.getName
john.constructor.prototype.getName == john.getName // true
Итак, повторюсь, наследование в ECMAScript достигается в первую очередь путем определения свойств / методов в прототипом конструктора функции, примером могут быть все основные конструкторы, такие как Date / Number / String, методы которых определены в соответствующих свойствах прототипа, что позволяет вам использовать эти методы при создании экземпляра с new
.
Помните, что вновь созданный объект имеет свойство constructor
, которое указывает на конструктор, который его создал, и мы можем напрямую получить доступ к свойству prototype
. Созданный нами объект john
не владеет напрямую методом getName
,
Прототип похож на определение класса, но его можно изменять динамически. Каждый раз, когда вы создаете экземпляр объекта определенного типа, он использует прототип в качестве шаблона.
Если вы измените прототип, объекты этого типа будут иметь эти изменения.