Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вызов стандартного конструктора без "new" (https://javascript.ru/forum/misc/17672-vyzov-standartnogo-konstruktora-bez-new.html)

Riim 29.05.2011 05:52

Вызов стандартного конструктора без "new"
 
Что-то меняется если вызывать стандартные конструкторы без "new"?
Например, "Object(true)" вместо "new Object(true)".

Aetae 29.05.2011 08:27

Object без new подобен Object'у c new, но без new.)

Riim 29.05.2011 08:52

Клёва :)

monolithed 29.05.2011 08:53

Цитата:

Сообщение от Riim
Что-то меняется если вызывать стандартные конструкторы без "new"?

в этом случае: происходит преобразование объектного типа к примитиву
var foo = Object(true);
alert(foo);


а в этом: new отвечает за создание внутреннего метода [[Construct]] и инициализацию его аргументов
function Foo() { // конструктор А
  this.bar = true;
}
 
var foo = new Foo;
alert(foo.bar);

Riim 29.05.2011 09:11

Цитата:

Сообщение от monolithed
происходит преобразование объектного типа к примитиву

разве не наоборот?

Aetae 29.05.2011 09:12

monolithed
Это как бы очевидно, но конкретно для пустого объекта роли не играет.

monolithed 29.05.2011 09:17

Цитата:

Сообщение от Riim
разве не наоборот?

нет, к примеру для String() неявно вызывается метод toString(), a для Number() метод valueOf()

Цитата:

Сообщение от Aetae
Это как бы очевидно, но конкретно для пустого объекта роли не играет.

однако, для Date, такой фокус не прокатит
так да:
var date = new Date;
alert(date.getDate());

а вот так уже нет:
var date = Date;
alert(date.getDate());


а для Array, String, Number, Function, RegExp вполне:
alert('foo'.match(RegExp('\\w', 'g')));

Riim 29.05.2011 09:42

"new Boolean(true)" это тоже примитивный тип? Наверное, там что-то вроде того:
function Object(item) {
	if (item != null) {
		return new item.constructor(item);
	}
	/* ..... */
}


UPD: хотя нет, если бы так, то alert срабатывал бы больше одного раза:
function Foo() {
	alert('Foo');
}
var foo = new Foo();

Object(foo);
new Object(foo);

monolithed 29.05.2011 09:58

кстати, Преобразование типов

Riim 29.05.2011 10:39

Цитата:

Сообщение от monolithed
a для Number() метод valueOf()

var n = 5;
alert('test' in Object(n));// false
alert('test' in new Number(n));// false
alert('test' in n.valueOf());// error
alert('test' in Number(n));// error


Часовой пояс GMT +3, время: 14:06.