1. Пространство имен :
Пространство имен в JS расширяется с использованием свойств объекта. Например, пользователь определяет объект A, с атрибутами B и C -атрибутами под объектом, а атрибуты B и C -атрибуты являются объектами. Следовательно, a = {b: {}, c: {}}, тогда пользователь может определить тот же метод и атрибут в объекте B и объекте C. Следовательно, B и C принадлежат к разным пространствам имен. Когда мы называем методы в объектах B и C, мы можем вызвать их через Ablike () и aclike (). Конечно A - это свойство в окне.
Но есть ситуация, например: страница Boke.js представляет jQuery.js и Prototype.js (они добавят атрибуты $ в окно -объект), и возникает конфликт.
Следовательно, в jQuery.js есть noconflict (), чтобы справиться с конфликтами. Процесс выполнения: страница первая вводит прототип. В настоящее время прототип будет занимать атрибут $ окна. Затем, когда JQUERY будет введен, JQUERY сохранит атрибут $ предыдущего окна в _ $, а затем сам по себе использует атрибут $. В настоящее время вы можете вызвать метод jQuery через $. Если вам не нужно использовать jQuery, но вы хотите использовать прототип, вы можете позвонить в $ .noconflict (), а затем $ будет восстановлен в объекте прототипа. В настоящее время вы можете использовать метод прототипа через $.
Кода -копия выглядит следующим образом:
var _ $ = window. $, _jquery = window.jquery;
noconflict: function (deep) {
окно. $ = _ $;
if (deep) window.jquery = _jquery;
вернуть jQuery; // возвращаемое значение, вы можете присвоить значение другим именам переменных, таких как Chaojidan, чтобы вы могли вызвать методы в jQuery через Chaojidan.
}
2. Расширение объекта :
Если есть объект пространства имен, нам нужно расширить функцию. Например: мне нужно скопировать все свойства и методы объекта A в объект B. Мне не нужно писать код один за другим в B -объектах.
Кода -копия выглядит следующим образом:
функциональный микс (Target, Source) {
var args = [] .slice.call (аргументы), i = 1,
iscover = typeof args [args.length-1] == "boolean"? args.pop (): true; // Не написано, по умолчанию верно, по умолчанию переопределяется.
if (args.length == 1) {
Target =! This.window? этот:{};
// Если есть только один параметр объекта, расширить этот объект. Например: я вызываю микс (b) в контексте объекта A, тогда это является в настоящее время, поэтому свойства и методы B будут добавлены в объект A. Однако, если Mix (b) называется в окне, свойства и методы в объекте B будут добавлены в пустой объект и вернуть этот пустой объект, чтобы предотвратить перезаписывание и методы того же имени в окно -объекте. (Только у оконных объектов есть свойства окон)
i = 0;
}
while ((source = args [i ++])) {
для (ключ в источнике) {
if (iscover ||! (ключ в цели)) // Если перезаписать, напрямую назначьте значение. Если не перезаписать, сначала определите, существует ли ключ в целевом объекте. Если это существует, значение не будет назначено.
{
target [key] = source [key];
}
}
}
вернуть цель;
}
Интервьюеры из крупных компаний любят проверять массивы. Вы можете проверить это. Каждый элемент в массиве может быть объектом, и даже если объект A и объект B обладают одинаковыми свойствами и методами, они не равны. Строки и цифры, такие как 123 и «123», можно найти в полном объеме, найдя поиск в Интернете.
3. Арализа :
В браузере, аргументы, аргументы, аргументы, аргументы, аргументы, документ.
Есть также пользовательский объект со специальным стилем письма
Кода -копия выглядит следующим образом:
var Arraylike = {
0: "a",
1: "B",
Длина: 2
}
Этот объект написан как объект jQuery.
Нам нужно преобразовать вышеупомянутый объект класса массива в объект массива.
[] .slice.call Method может быть решен. Тем не менее, HTMLCollection и Nodelist в старой версии IE не являются подклассами объекта, а метод [] .slice.call не может быть использован.
Поэтому мы можем переопределить метод среза.
Кода -копия выглядит следующим образом:
A.slice = window.dispatchevent? function (узлы, start, end) {return [] .slice.call (узлы, начало, end); }
// Если у окна есть свойство DispatchEvent, оно доказывает, что оно поддерживает метод [] .slice.call и обнаружение способности.
: function (узлы, начало, конец) {
var ret = [], n = nodes.length;
if (end == undefined || typeof end === "number" && isfinite (end)) {// && Приоритет выше ||, так что End не записан, или End - конечное число и введите
start = parseint (Start, 10) || 0; // Если старт не существует или не является числом, то значение назначено 0.
end = end == не определен? n: parseint (конец, 10); // Если конец не существует, значение n.
if (start <0) start + = n;
if (end <0) end + = n;
if (end> n) end = n;
для (var i = start; i <end; i ++) {
ret [i-start] = узлы [i]; // низкая версия, т.е. Использует форму назначения массива
}
}
возврат возврата;
}
4. тип суждения :
Существует пять простых типов данных JS: нулевые, неопределенные, логические, число, строка.
Существуют также сложные типы данных: объект, функция, regexp, дата, пользовательские объекты, такие как: человек и т. Д.
TypeOF обычно используется для оценки логического, числа, строки, экземпляра, как правило, используется для оценки типов объектов. Но у них все есть недостатки. Например: экземпляр массива в Fireme не является экземпляром массива в родительском окне, вызов экземпляра вернет false. (Этот вопрос был задан во время набора в кампусе 360). TypeOf New Boolean (TRUE) // «Объект», оберните объект. Boolean, Number и String представляют собой три типа объектов упаковки, которые обсуждаются в программном программировании JS Advanced Programing.
Многие люди используют документ TypeOF. Все, чтобы определить, есть ли он IE. На самом деле, это очень опасно. Поскольку Google и Firefox также нравятся это свойство, эта ситуация возникает в Google Chrome: TypeOf Document.all // Неопределенный, однако, Document.all // htmlallcollection, используя TypeOF, чтобы определить, что он не определен, но это значение свойства можно прочитать.
Но теперь вы можете использовать метод object.prototype.tostring.call для определения типа. Этот метод может непосредственно выводить [[класс]] внутри объекта. Однако объекты IE8 и ниже окна не могут использовать этот метод. Вы можете использовать Window == Document // True Document == Window // FALSE IE6,7,8.
Nodetype (1: Элемент 2: Атрибут 3: Текст текст 9: документ)
Методы оценки типов в jQuery:
Кода -копия выглядит следующим образом:
class2type = {}
jquery.each ("Boolean Number String Function Marry Date Date Regexp объект" .split (""), function (i, name) {
class2type ["[object" + name + "]"] = name.tolowercase ();
// class2type = {"[object boolean]": boolean, "[номер объекта]": number, "[объект строки]": string, "[object function]": function, "[array объекта]": array ......}
});
jquery.type = function (obj) {// Если obj null, не определен и т. Д., строка «null», «неопределенное». Если нет, вызовите метод ToString, судите, если его можно вызвать, и если это возможно, верните объект (окно, DOM и другие объекты ActiveXObject в нижней версии IE)
вернуть obj == null? String (obj): class2type [toString.call (obj)] || "объект";
}
5.domredy
При использовании узла DOM от JS страница должна построить дерево DOM. Поэтому обычно используется метод окна. Тем не менее, метод нагрузки не будет выполняться после загрузки всех ресурсов. Чтобы страница реагировала на операции пользователей быстрее, нам нужно использовать операции JS только после того, как дерево DOM будет построено. Вместо того, чтобы ждать загрузки всех ресурсов (изображение, Flash).
Следовательно, происходит загруженное событие Domcontent, которое запускается после создания дерева DOM. Тем не менее, старая версия IE не поддерживает его, так что есть взлом.
Кода -копия выглядит следующим образом:
if (document.readystate === "overse") {// В случае загрузки файла JS только после загрузки документа DOM. В настоящее время метод FN (метод, который вы хотите выполнить) выполняется посредством этого решения. Поскольку после загрузки документа значение Document.ReadyState завершено
setTimeout (fn); // Выполнить асинхронно, пусть код за ним будет выполнен первым. Это использование в jQuery, вам не нужно это понимать.
}
else if (document.addeventlistener) {// Поддержка Domcontentloaded событие
document.addeventlistener ("domcontentload", fn, false); // пузырьки
window.addeventListener ("Load", fn, false); // В случае загрузки файла JS после построения дерева DOM. На этот раз событие Domcontently, загруженное не будет запускаемо (триггер завершен), оно только запустит событие загрузки.
}
еще{
document.attachevent ("onreadystatechange", function () {// Для безопасности iframes в IE, выполнение Onload будет дано приоритет, а иногда нет.
if (document.readystate === "overse") {
fn ();
}
});
window.attachevent ("onload", fn); // Это всегда будет играть роль в случае, если другие события прослушивания не будут извлечены, поэтому, по крайней мере, метод FN может быть вызван событием Onload.
var top = false; // посмотрите, есть ли это в iframe
Попробуйте {// window.frameelement - это iframe или Frame, содержащий эту страницу. Если нет, то это ноль.
top = window.frameelement == null && document.documentelement;
} catch (e) {}
if (top && top.doscroll) {// Если нет iframe, и это IE
(функция doscrollcheck () {
пытаться{
top.doscroll ("слева"); // в т.е. Если дерево DOM построено, вы можете вызвать метод Doscroll HTML
} catch (e) {
return SetTimeout (doscrollcheck, 50); // Если он еще не построен, продолжайте слушать
}
fn ();
})
}
}
Метод FN должен содержать удаление всех событий связывания.
Конечно, т.е. также может использовать сценарий Defer Hack. Принцип: сценарий, указанный DEFER, будет выполняться только после того, как дерево DOM будет построено. Тем не менее, это требует добавления дополнительных файлов JS и редко используется в отдельных библиотеках.
Принцип использования: Добавьте теги сценария в документ и используйте Script.src = "xxx.js", чтобы прослушать событие Script's OnreadyStateChange. Когда это. ReadyState == «Заполнить», метод FN выполняется.
Другими словами, только после того, как DOM будет построен xxx.js, и это будет завершено.
Выше примечание для чтения для первой главы дизайна Framework JavaScript. Контент относительно прост, что облегчает для всех лучше понять основное содержание этой главы.