Встроенные функции конструктора в Javascript - PullRequest
4 голосов
/ 17 марта 2012

Когда я делаю:

var person = new Object();  
person.name = "alex";
console.log(person)

вывод равен:

Object { name="alex"}

Однако, скажем, я опускаю "новое" слово и делаю:

var person = Object();  
person.name = "alex";
console.log(person)

Вывод также:

Object { name="alex"}

Почему?

Ответы [ 2 ]

4 голосов
/ 17 марта 2012

Потому что некоторые встроенные функции просто определены, чтобы действовать таким образом. Например, см. ES5 15.2.1.1 для Object:

15.2.1.1 Объект ([значение])

Когда функция Object вызывается без аргументов или с одним аргументом значение , предпринимаются следующие шаги:

  1. Если значение равно null, undefined или не указано, создайте и верните новый объект Object точно так же, как если бы стандартный встроенный конструктор Object был вызван с теми же аргументами ( 15.2.2.1 ).
  2. Возврат ToObject(value).

Они проверяют, были ли они вызваны с new или нет, и если не действуют, как если бы они были вызваны с new.

Не все конструкторы работают так. Например, Date вернет строку при вызове без new.


Вы можете реализовать это самостоятельно:

function Foo() {
    if(!(this instanceof Foo)) {
        return new Foo();
    }
    // do other init stuff
}

Foo() и new Foo() будут действовать одинаково (хотя с переменными аргументами все сложнее).

0 голосов
/ 16 мая 2019

Поскольку ваш пример представляет собой встроенную функцию типа Object, как было сказано выше, он аналогичен для этого типа, он не работает аналогичным образом для большинства других встроенных функций, таких как Number (). , Вы должны быть очень осторожны, вызывая их с ключевым словом «новый» или нет. Потому что по умолчанию ключевое слово 'new' с конструктором функции возвращает объект, а не примитивный тип напрямую. Таким образом, вы не можете, например, проверить строгое равенство двух переменных, одна из которых объявлена ​​и присвоена с помощью new Number(), а другая с Number()

Примером может быть:

var num1 = Number(26); 
var num2 = new Number(26);

num1 == num2; // returns true

num1 === num2; // returns false

Вы можете проверить разницу в журнале консоли:

console.log(num1);
> 26

console.log(num2);
> Number {26}
>     __proto__: Number
>     [[PrimitiveValue]]: 26

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...