Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
use strict'var array = [].slice.call(arguments);
$('div').each(function () {
$(this); // <== here
});
</source.!{ x: 42,
func: function(){
console.log(this.x);
}
}.func() // 42
var foo = {
show: function() {
$('body').css('color', '#F');
return this;
}
/** ... */
}.show();var foo = 0, bar = new Number(0);
console.log( !foo, !bar ); // true, false
var bar = new Number(0);
console.log(!(bar + 0))var bar = new Number(0);
console.log(!+bar);
new Object(true), иначе — false. Плохо, если в таком случае необходимо и в отрицательном варианте хранить дополнительные свойства.enumerable = falseМожет написать статью по объектам в js? надо погуглить хабр есть ли тут такое
В JavaScript, неважно, выполняется ли скрипт в браузере или в ином окружении, всегда определен глобальный объект. Любой код в нашем скрипте, не «привязанный» к чему-либо (т.е. находящийся вне объявления объекта) на самом деле находится в контексте глобального объекта.
Constructor.prototype.factory = new function() {
function Factory(args) { return Constructor.apply(this, args); }
Factory[prototype] = Constructor[prototype];
return function(args) { return new Factory(args || []); }
}
Constructor.factory([1, 2, 3]) == new Constructor(1, 2, 3)
Constructor.factory = new function() {
Array.factory = new function() {
function Factory(args) { return Array.apply(this, args); }
Factory.prototype = Array.prototype;
return function(args) { return new Factory(args || []); }
}
console.log( Array.factory([5]).length ); // 5
Ну я могу написать функцию которая будет по разному себя вести в зависимости от того как она вызывается, как конструктор или как функция.
atom.Class такое реализовано. Был вдохновлён Numberthis instanceof Class — не подходит:var Class = function () {
if ( this instanceof Class ) {
console.log('first');
} else {
console.log('second');
}
};
Class.factory = new function() {
function Factory(args) { return Class.apply(this, args); }
Factory.prototype = Class.prototype;
return function(args) { return new Factory(args || []); }
}
Class.factory();
return [ this, arg1, arg 2];return [ this, arg1, arg2 ];setTimeout(someObj.someFunc, 1000);var someFunc = someObj.someFunc;
someFunc();
setTimeout( function(){ someObj.someFunc() }, 1000 );setTimeout( "someObj.someFunc()", 1000 );// или так:
setTimeout( someObj.someFunc.bind(someObj) , 1000 );
// или при помощи mootools:
someObj.someFunc.delay(1000, someObj);
Лечится например так:Именно так в конце концов и поступил (по первому способу, второй не прокатил бы, т.к. в качестве someObj выступал локальный объект, а не глобальный). Но с точки зрения незамутнённого сознания всё-таки не совсем логично создавать новую «пустую» функцию исключительно для того, чтобы сохранить привязку к объекту…
В данном случае, мы как бы скопировали всю функцию, включая список аргументов и тело, и присвоили получившийся объект свойству make объекта arrayMaker. Это равносильно такому объявлению:Не скопировали, а присвоили ссылку на созданную функцию новой переменной. И это не равносильно такому объявлению, так как в нем как раз создается новая аналогичная функция.
var arrayMaker = {
someProperty: 'Какое-то значение';
make: function (arg1, arg2) {
return [ this, arg1, arg 2];
}
};
(function (x){ console.log(x);})('Hello world');
!function (x){ console.log(x);}('Hello world');
(function f(x){ console.log(x); return f; })('Hello')('world');
// при этом прошу заметить
f('foo'); // exception
(function f(x){ console.log(x); if(x>0) f(x-1);})(10);
// 1. через ключевое слово get
var o = {
get pewpew () {
console.log('pass');
}
}
// неявно вызываем функцию pewpew
o.pewpew;
// 2. через __defineGetter__
var o = {};
o.__defineGetter__("pewpew", function blabla(){
console.log('pass');
});
// неявно вызываем функцию blabla
o.pewpew;
// 3. через __defineSetter__
Object.prototype.__defineSetter__("pew", function blabla(a){
console.log('pass');
});
// неявно вызываем функцию blabla
({}).pew = 152;
// 4. через Proxy (существует куча ловушек, обработчик каждой можно неявно вызвать)
var o = Proxy.create({
get: function () {
console.log('pass');
}
}, {});
// неявно вызываем функцию-ловушку get
o.pewpew1;
o.pewpew2;
o.pewpew3;
__defineSetter__, кстати, можно провернуть один трюк с JSONP. Вместо функции обработчика можно передать ({}).pew= и настроить обработчик на «pew»:Object.prototype.__defineSetter__("pew", function pewHook(a){
console.log(a.aaa === 123);
// снимаем обработчик "pew" ...
});
// Сервер подчинится и отправит нам код в таком формате, как будто это вызывается какая-то функция:
({}).pew=({'aaa':123});
// Дальше отработает pewHook
Ничего полезного в этом нет (просто «финт ушами»), разве что не засоряются глобалы на время ожидания JSONP. Не все сервера принимают обработчик такого формата (проверял на Flickr — не заработало).
Пять способов вызвать функцию