Что такое прототипы в JavaScript?

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
7
задан Bill the Lizard 21 June 2011 в 15:30
поделиться

2 ответа

Разница в том, что в последнем примере вы создаете статический метод, который не наследуется, если Пример является функцией-конструктором. Определяя свойства в свойстве 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 ,

5
ответ дан 7 December 2019 в 07:46
поделиться

Прототип похож на определение класса, но его можно изменять динамически. Каждый раз, когда вы создаете экземпляр объекта определенного типа, он использует прототип в качестве шаблона.

Если вы измените прототип, объекты этого типа будут иметь эти изменения.

2
ответ дан 7 December 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: