Pergunta

Por favor, ajude-me a entender por que o código a seguir funciona:

<script>
    var re = RegExp('\\ba\\b') ;
    alert(re.test('a')) ;
    alert(re.test('ab')) ;
</script>

Na primeira linha não há new operador.

Pelo que eu sei, um empreiteiro em JavaScript é uma função que inicializa objetos criados pelo operador new e eles não foram feitos para devolver nada.

Foi útil?

Solução

Em geral, se algo estiver documentado como sendo um construtor, use new com isso.Mas neste caso, RegExp tem um comportamento de "fábrica" ​​definido para a situação em que você o chamou como uma função.Consulte a Seção 15.10.3 do ECMAScript (JavaScript) especificação (que está vinculado à especificação de saída;o número da seção é o mesmo na nova especificação, que você pode baixar no ECMA primeira página [no lado direito];Não quero vincular diretamente a um arquivo PDF de aproximadamente 4 MB):

15.10.3 O construtor RegExp chamado como uma função
15.10.3.1 RegExp(padrão, sinalizadores)
Se o padrão for um objeto R cuja propriedade [[Class]] for "RegExp" e os sinalizadores forem indefinidos, retorne R inalterado.Caso contrário, chame o construtor RegExp (15.10.4.1), passando-lhe os argumentos padrão e sinalizadores e retorne o objeto construído por esse construtor.

Na verdade, você pode definir suas próprias funções de construtor JavaScript para permitir a omissão do new palavra-chave (detectando que eles foram chamados como uma função e virando-se e chamando-se corretamente), mas eu não sugeriria isso, pois leva a um código enganoso.

Outras dicas

+1 TJ Crowder tem. O padrão ECMAScript se esforça para definir comportamentos para as funções do construtor interno quando chamadas de funções simples. Muitas vezes, simplesmente se chama de volta como construtor, mas há alguns casos mais complicados.

Construtores em JavaScript [...] não devem devolver nada

Em geral, um construtor posso ignorar this E apenas devolva um objeto independente:

function Thing() {
    return {'foo': 1};
}

Nesse caso, você pode usar a função igualmente como um construtor (com new) ou uma função clara.

Se o construtor não retornar nada, como é o padrão usual para os construtores, o new O próprio operador garante que retorne o novo objeto criado e passado como this. Nesse caso, você deve usar new.

É melhor não confiar em um construtor que trabalha como uma função nua, e os comportamentos alternativos dos construtores embutidos raramente são de qualquer utilidade; portanto, geralmente você deve ficar com new.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top