Дело в том, что Отец изменил свой прототип (Father.prototype.color = 'green';), а поиск свойства color лежит сперва через прототип отца. Вот так выглядит объект f:
f = {
__proto__: { // Прототип Father
color: 'green', // Отец решил вернуть цвет
__proto__: { // Прототип Grandfather
color: 'blue', // Дед решил поменять на синий
__proto__: Object.prototype
}
}
}
При выполнении f.color сначала произойдет поиск в собственных свойствах (не найдено), затем алгоритм будет искать в f.__proto__ — найдено! (color: 'green'). Вобщем до прототипа деда и не дойдет.
Если же отец удалит цвет из своего прототипа, то все опять «телепатически» посинеют, кроме сына у которого есть собственное свойство color.
Это понятно. Проблема не в типе записи двоичного числа, а в возможности преобразовать массив в двоичную строку — нет метода toBinaryString() или подобного.
Вопрос:
Стоит ли использовать childProcesses в node.js для каждого запроса в высоко-нагруженных проектах?
Ответ:
Для каждого запроса ни в коем случае не стоит использовать childProcesses потому, что мы получаем слишком много накладных расходов (это как PHP с апачем): выделение памяти, время форка, время инициализации (jid компиляция) и т.п. Node.js очень хорошо распределяет нагрузку и загружает одно ядро процессора в своем «evented processing loop» — основной поток приложения. Идеальная загрузка для Node.js — по 1му форку на ядро, лучше всего форкать, используя github.com/LearnBoost/cluster Кластер будет выступать в роли мастеров(балансир), а форки — слэйвы. Оправдано использование childProcesses для тяжелых запросов.
Можно ещё почитать тут: stackoverflow.com/questions/3491811/node-js-and-cpu-intensive-requests
Вопрос:
В node.js при использовании runInNewContext пропадают глобалы, а именно нет console.log Как правильно с этим бороться? Можно конечно в контекст добавить ссылку на console, но если понадобится еще какой-то глобальный элемент, а потом еще и еще… не прописывать же все? Думаю можно пройти в цикле по глобалу и передать все доступные объекты в контекст. Но насколько это правильно, может существует другое решение? Речь идет оnode-js.ru/12-control-context-using-runinnewcontext
Ответ:
Если понадобится другой объект, то придется добавить — такова политика сендбоксинга.
Единственное применение данной технологии я вижу для запуска чужого, потенциально опасного кода (так делает хостинг Node.js — nodester). Если же критической в этом необходимости нет, то я категорически против этого — это совершенно не нужная обертка, которую можно не использовать если выбрать правильную архитектуру приложения и использовать договоренности при разработке. Чем плохо: создание/удаление контектса — выделение памяти как следствие частый GC (который блокирует все приложение). Думаю будут проблемы с поддержкой такого кода.
Вопрос:
Какая модель создания объектов наиболее удобная? Если с new, то как защищаетесь от ошибок:
1. Функции-конструкторы пишу всегда с большой буквы;
2. Проверяют валидность создания через this instanceof Имя_функции (избегаю this instanceof arguments.callee по соображения производительности)
3. Аналогично второму, но сверяюсь с window, т.к. не хочу хардкодить имя и не пишу скрипты для out-of-browser сред.
Ответ:
Лучше, привычнее и идеологические создавать объекты через new. Конструкторы стоит называть с заглавной буквы.
Я предпочитаю основываться на соглашениях и не проверяю this внутри конструктора — вызвал конструктор без new и поэтому утекло в глобалы — значит «сам дурак». И не в коем случае не поощряю ошибку с new — некоторые проверяют если this это глобал значит пользователь вызвал конструктор без new и создают внутри конструктора объект и возвращают его — это поощрение ошибки и идеологически не верный подход.
Используя "use strict" все значительно проще:
var Obj = function () {
"use strict";
this.pew = 100;
};
// Правильно
new Obj.pew++;
// пользователь словит ошибку
Obj(); // TypeError: this is undefined
new не приемлем для factory методов, и коротких конструкторов — jQuery
Вопрос:
«Суть такая мне нужно не используя jquery (будет как собственное АПИ сайта) создать аналог функции $.ajax (а/синхронный запрос )
нашел в интернете пример создания объектов: ru.wikipedia.org/wiki/XMLHttpRequest
но проблема в firefox, не работает, но проблем больше чем просто firefox, то авторизация то еще что нибудь)
Создал тему на форуме www.sql.ru/forum/actualthread.aspx?tid=853420 даже на таком форуме ответов нет.
Есть ли какая нибудь универсальная кросс браузерная функция ?»
С форума sql:
The ISA Server requires authorization to fulfill the request. Access to the Web Proxy filter is denied.
Ответ: Приведу в качестве примера недавно созданную функцию. Похоже ваш сервер требует basic auth, поэтому сразу изменю функцию:
function xhr(m,u,c,p,l,s,x){
with(new(this.XMLHttpRequest||ActiveXObject)("Microsoft.XMLHTTP"))
onreadystatechange=function(x){readyState^4||c(x)},open(m,u,false,l,s),send(p)
}
// Использование
xhr('get', 'http://path.to/server?with=parameters', function (xhr) {
alert(xhr.status + ':' + xhr.responceText);
}, null, "username", "password");
Нет. Это обман зрения :) Давайте разберем: var N = 3, a; while (a in [1..N]) ...
1. мы у 1.0 (1.) пытаемся получить свойство N через точечную нотацию — его нет, поэтому 1..N возвратит undefined. Переменная N объявлена для отвлечения и никакой нагрузки не несет.
2. в итоге мы имеем массив [undefined] - (0: undefined),
3. дальше мы пытаемся узнать, а есть ли что-то с ключем undefined (a===undefined) в нашем массиве — a in [undefined] получаем false.
Сколько раз отработает alert?: Ответ в обоих случаях — 0
Использовал nodester (подобие Heroku для Node.js) для запуска сервера распределенных вычислений на JavaScript. Он базируется на Amazon EC2. Ничего плохого сказать не могу.
А я вижу — путать людей не посвященных в JavaScript :) Вот вам quiz:
var N = 3;
while (1..N) {
alert(0); // <<< Сколько раз отработает alert?
}
// или вот так
var N = 3;
while (a in [1..N]) {
alert(a); // <<< Сколько раз отработает alert и что выведет?
}
Чтобы не путать читателей уточню: null — примитивное значение, представляющее нулевую, пустую, не существующую ссылку undefined — примитивное значение, которое получает каждая перемененная по умолчанию (когда переменная не имеет значение) void — оператор (т.е. скобки не нужны), выполняющий выражение и всегда возвращающий undefined
В JavaScript, кстати, каждая функция по умолчанию возвращает undefined
Father.prototype.color = 'green';
), а поиск свойства color лежит сперва через прототип отца. Вот так выглядит объект f:При выполнении f.color сначала произойдет поиск в собственных свойствах (не найдено), затем алгоритм будет искать в
f.__proto__
— найдено! (color: 'green'
). Вобщем до прототипа деда и не дойдет.Если же отец удалит цвет из своего прототипа, то все опять «телепатически» посинеют, кроме сына у которого есть собственное свойство color.
toBinaryString()
или подобного.Если выполнить вот этот код в глобалах, то мы получим ссылку на глобальную переменную:
Но такой трюк нельзя провернуть внутри другого scope: this будет undefined. Добавлю этот 4-й почти идеальный вариант.
"use strict"
не сработает).Почему так происходит можно узнать в статье JavaScript Strict Mode § Почему я не могу включить Strict Mode в консоли моего браузера?
Стоит ли использовать childProcesses в node.js для каждого запроса в высоко-нагруженных проектах?
Ответ:
Для каждого запроса ни в коем случае не стоит использовать childProcesses потому, что мы получаем слишком много накладных расходов (это как PHP с апачем): выделение памяти, время форка, время инициализации (jid компиляция) и т.п. Node.js очень хорошо распределяет нагрузку и загружает одно ядро процессора в своем «evented processing loop» — основной поток приложения. Идеальная загрузка для Node.js — по 1му форку на ядро, лучше всего форкать, используя github.com/LearnBoost/cluster Кластер будет выступать в роли мастеров(балансир), а форки — слэйвы. Оправдано использование childProcesses для тяжелых запросов.
Можно ещё почитать тут: stackoverflow.com/questions/3491811/node-js-and-cpu-intensive-requests
Вопрос:
В node.js при использовании runInNewContext пропадают глобалы, а именно нет console.log Как правильно с этим бороться? Можно конечно в контекст добавить ссылку на console, но если понадобится еще какой-то глобальный элемент, а потом еще и еще… не прописывать же все? Думаю можно пройти в цикле по глобалу и передать все доступные объекты в контекст. Но насколько это правильно, может существует другое решение?
Речь идет о node-js.ru/12-control-context-using-runinnewcontext
Ответ:
Если понадобится другой объект, то придется добавить — такова политика сендбоксинга.
Единственное применение данной технологии я вижу для запуска чужого, потенциально опасного кода (так делает хостинг Node.js — nodester). Если же критической в этом необходимости нет, то я категорически против этого — это совершенно не нужная обертка, которую можно не использовать если выбрать правильную архитектуру приложения и использовать договоренности при разработке. Чем плохо: создание/удаление контектса — выделение памяти как следствие частый GC (который блокирует все приложение). Думаю будут проблемы с поддержкой такого кода.
Какая модель создания объектов наиболее удобная? Если с new, то как защищаетесь от ошибок:
1. Функции-конструкторы пишу всегда с большой буквы;
2. Проверяют валидность создания через this instanceof Имя_функции (избегаю this instanceof arguments.callee по соображения производительности)
3. Аналогично второму, но сверяюсь с window, т.к. не хочу хардкодить имя и не пишу скрипты для out-of-browser сред.
Ответ:
Лучше, привычнее и идеологические создавать объекты через new. Конструкторы стоит называть с заглавной буквы.
Я предпочитаю основываться на соглашениях и не проверяю this внутри конструктора — вызвал конструктор без new и поэтому утекло в глобалы — значит «сам дурак». И не в коем случае не поощряю ошибку с new — некоторые проверяют если this это глобал значит пользователь вызвал конструктор без new и создают внутри конструктора объект и возвращают его — это поощрение ошибки и идеологически не верный подход.
Используя
"use strict"
все значительно проще:new не приемлем для factory методов, и коротких конструкторов — jQuery
«Суть такая мне нужно не используя jquery (будет как собственное АПИ сайта) создать аналог функции $.ajax (а/синхронный запрос )
нашел в интернете пример создания объектов: ru.wikipedia.org/wiki/XMLHttpRequest
но проблема в firefox, не работает, но проблем больше чем просто firefox, то авторизация то еще что нибудь)
Создал тему на форуме www.sql.ru/forum/actualthread.aspx?tid=853420 даже на таком форуме ответов нет.
Есть ли какая нибудь универсальная кросс браузерная функция ?»
С форума sql:
Ответ: Приведу в качестве примера недавно созданную функцию. Похоже ваш сервер требует basic auth, поэтому сразу изменю функцию:
var N = 3, a; while (a in [1..N]) ...
1. мы у
1.0 (1.)
пытаемся получить свойство N через точечную нотацию — его нет, поэтому1..N
возвратитundefined
. Переменная N объявлена для отвлечения и никакой нагрузки не несет.2. в итоге мы имеем массив
[undefined] - (0: undefined)
,3. дальше мы пытаемся узнать, а есть ли что-то с ключем
undefined
(a===undefined
) в нашем массиве —a in [undefined]
получаем false.Сколько раз отработает alert?: Ответ в обоих случаях — 0
null — примитивное значение, представляющее нулевую, пустую, не существующую ссылку
undefined — примитивное значение, которое получает каждая перемененная по умолчанию (когда переменная не имеет значение)
void — оператор (т.е. скобки не нужны), выполняющий выражение и всегда возвращающий undefined
В JavaScript, кстати, каждая функция по умолчанию возвращает undefined
(с
)
в коде на ©?Кросс-браузерный немного длиннее
Usage:
«Как с помощью JS сделать одновременный выбор и загрузку нескольких файлов?»