Конвенция для опытного наследования в JavaScript

Я думаю, что вы забыли вызвать «функцию», когда щелкнул переключатель.

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<label>
    <input type="radio" name="travel_type"value=""class="with-gap" 
    id="one_way" onclick="functionRadioChecked();">
    <span style="color:red;">One Way</span>
</label>
<label>
    <input type="radio"name="travel_type"value=""class="with-gap"id="round_trip">
    <span style="color: red;">Round Trip</span>   
</label>

<br><br><br>
<input type="date" id="datepicker1">

<script>
function functionRadioChecked() {
    var button = document.getElementById('one_way');
    if (document.getElementById('one_way').checked) {
        document.getElementById('datepicker1').disabled = true;
    }
}

</script>

</body>
</html>
7
задан nicael 11 May 2014 в 18:58
поделиться

3 ответа

'конструктор' не делает то, что похоже, что это делает. Это, в дополнение к его нестандартности, является серьезным основанием избегать использования, оно - придерживается instanceof и прототипа.

Технически: 'конструктор' не является свойством' экземпляра, это - свойство показа объекта прототипа 'Sub' через. При создании функции 'Sub' в Mozilla Вы получаете недавно чеканивший объект Sub.prototype по умолчанию, который имеет 'конструктора', указывающего назад на функцию Sub как любезность.

Однако Вы затем заменяете тот прототип новой Основой (). Исходный прототип по умолчанию со ссылкой назад на Sub потерян; вместо этого, Sub.prototype является экземпляром Основы без любого переопределяющего свойства 'конструктора'. Так:

new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base

... полностью вниз к самому основному объекту, прототип которого Вы не изменили.

Действительно ли это является стандартным/лучше, чтобы сделать это?

Когда контакт с объектами/классами JavaScript там не является никакой конвенцией; система метакласса каждой библиотеки ведет себя немного по-другому. Я не видел тот, который пишет 'конструктору' в каждый производный класс вручную, но кажется столь же хорошим решением как любой, если Вы действительно хотите иметь настоящего конструктора в наличии; это также сделает код совместимым с браузерами/механизмами, которые не дают Вам 'конструктора'.

Я считал бы давание его другим именем, тем не менее, для предотвращения беспорядка с существующим и по-другому ведущим себя свойством 'конструктора'.

9
ответ дан 6 December 2019 в 19:43
поделиться

Если Вы хотите протестировать, является ли объект точно экземпляром использования Sub instanceof оператор:-

print(s instanceof Sub);

Если Вы хотите знать, является ли объект экземпляром Sub, или экземпляр подкласса Sub используют isPrototypeOf метод:-

print(Sub.prototype.isPrototypeOf(s));
3
ответ дан 6 December 2019 в 19:43
поделиться

Да,

Sub.prototype.constructor = Sub;

давайте использовать instanceof, но есть решение получше. Посмотрите здесь:, Наследование TDD JS на GitHub и найдите шаблон Паразитное наследование комбинации . Код написан в TDD, поэтому вы сможете быстро его разобрать, а затем просто изменить имена, чтобы начать работу. Это в основном то, что использует YAHOO.lang.extend (источник: сотрудник yahoo и автор статьи Николаса Закаса, «Профессиональный JavaScript для веб-разработчиков», 2-е издание, стр. 181). Кстати, хорошая книга (никак не аффилированная!)

Почему? Поскольку классический шаблон, с которым вы работаете, имеет статические ссылочные переменные (если вы создадите var arr = [1,2] в базовом объекте, ВСЕ экземпляры будут иметь чтение / запись и будут «совместно использовать состояние» 'arr'! Если вы используете кражу конструктора, вы можете обойти это. См. Мои примеры.

1
ответ дан 6 December 2019 в 19:43
поделиться
Другие вопросы по тегам:

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