Pull to refresh

Comments 21

>>100000000000000000000
для таких числе
.toFixed(/* количество знаков после запятой */)
сорри немного затупил показалось что там запята)=)
А какие преимущества это дает, кроме отсутствия слова 'new'? Усложнение и большая запутанность кода?
Представте себе — не задалбывает. Потому что я вижу что я создаю новый обьект а не вызываю функцию.
Вызывая функцию на подобие $('.some-class'), я тоже вижу, что создаю объект, так как я знаю, что функции могут создавать новые объекты.
Явное лучше неявного.
Мне главное чтоб JavaSript был согласен.
а javascript пофигу вообще =) new не new, просто конструкция немного упрощает возврат результата.
function a()
{
    return {'a':'b'}
} 
Не стоит поощрять ошибки и пользоваться такими вещами.
Не стоит поощрять ошибки и пользоваться такими вещами.


О каких ошибках вы говорите?

Когда функция-конструктор вызывается как часть выражения с new, то это конструктор, который инициализирует создание нового объекта.

Далее в качестве примера, предлагаю кратко рассмотреть поведение предопределенных конструкторов в ECMAScript

Вызов конструктора в качестве функции (без оператора new) для типов Number, String и Boolean приводит к неявному преобразованию типов:

typeof Number([])      // number
typeof new Number([])  // object

//...


Такие операции преобразования типов в ECMAScript выполняется за счет наличия внутреннего метода [[DefaultValue]], который для нативных объектов возвращает примитивное значение в строгом соответствии с таблицами преобразований для внутренних методов ToBoolean, ToNumber, ToString и ToObject.

Для получения значения вызываются методы valueOf() или toString().

Смоделировать подобное поведение для пользовательских объектов не составит большого труда:

var object = {
	property: 1,
	valueOf: function() {
		return this.property;
	}
};

console.log(+object); // 1


Такое преобразование происходит за счет активации внутреннего метода ToPrimitive, который в свою очередь неявно вызывает метод valueOf().

Теперь давайте рассмотрим более объектно-ориентированный способ:

var Foo = function(param) {
	if(this instanceof Foo)
		return this.param;
	else
		return param || 1;
};

Foo.prototype.valueOf = function() {
	return this.param || 1;
};

console.log(Foo());       // 1
console.log(Foo(10));     // 10
console.log(new Foo);     // Object
console.log(+new Foo);    // 1
console.log(new Foo + 1); // 2


Помимо примитивных значений есть еще объектные:

var object = new Object({property: 1});
console.log(object.property) // 1

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

Иными словами, в Object мы можем передать не только объект, но и такие примитивные типы, как Boolean, Number и String:

var boolean = new Object(true);     // [object Boolean]
var number  = new Object(1);        // [object Number]
var string  = new Object('string'); // [object String]

Использование оператора new в данном случае опционально, как и с другими конструкторами, такими как Array, Function и RegExp:

new Array(1, 2);  // [object Array]
new Function(''); // [object Function]
new RegExp('');   // [object RegExp]

В этом случае отсутствие оператора new трактуется как вызов конструктора в качестве функции.
Однако, возможны исключения когда наличие оператора new действительно влияет на результат:

var type = function(object) {
	return Object.prototype.toString.call(object);
};

type(new Date);  // [object Date]
type(Date);      // [object Function]
type(Date());    // [object String]
type(+new Date); // [object Number]


Во-первых, прошу обратить внимание на то, что все четыре вызова возвращают разные результаты. У неподготовленных пользователей, вероятно, это приведет к баттхёрту :)

Примечание: особо стоит отметить, то что объект Math не имеет внутреннего свойства [[Construct]] из-за чего невозможно использовать этот объект как конструктор с оператором new.
Также объект Math не имеет внутреннего свойства [[Call]] из-за чего невозможно вызывать этот объект как функцию!

Таким образом, можно сказать, что для построения архитектуры собственных конструкторов, использование fallback'a (вызов конструктора в качестве функции без оператора new) не может считаться ошибкой если он спроектирован грамотно.
Подсознательно я стремлюсь к работе моего кода в самых суровых условиях.
В смысле запрещено только в строгом режиме
Я хотел сказать про вызовы конструкторов классов, вроди:
var MyConstructor = function(){};
MyConstructor();
new MyConstructor();

напримерн может случится вот так:
MyConstructor.prototype.alert = function(){ return 1+1;};

(хотел сказать что вызов функции конструктора без new установит ссылку на this = window может как то запутанно объясняю)
есть библиотека Fraction.js.
не знал, пригодится
А, да, ещё модуль в Dojo Toolkit — dojox.math.BigInteger
BigInt.js — отличная библиотека для криптологов. Очень долго с ней работал.
Sign up to leave a comment.

Articles