Preguntas de entrevista clásicas de cadena de prototipos getName ()

Este artículo resolverá las preguntas clásicas de la entrevista de la cadena prototipo getName () para todos

tema

Pon la pregunta completa primero

   function Foo() {
            getName = function() {
                console.log(1);

            }
            return this;
        }
        Foo.getName = function() {
            console.log(2);

        };
        Foo.prototype.getName = function() {
            console.log(3);

        }
        var getName = function() {
            console.log(4);

        }

        function getName() {
            console.log(5);

        }

        Foo.getName();
        getName();
        Foo().getName();
        getName();
        new Foo().getName();
       new Foo().__proto__.getName();
        new Foo.getName();
        new new Foo().getName();

responder

Aquí, debido a que algunos amigos tienen una mejor base, ponga la respuesta aquí primero y tendrá que ver el análisis más tarde.
Inserte la descripción de la imagen aquí

análisis

Primero, todo el tema

Para crear GO,
primero aumente el getName declarado por var y asígnelo a underfined, luego eleve el cuerpo de la función de asignación de la función Foo (), sobrescriba la función getName () { console.log (5);} sobre el getName declarado arriba , y luego miramos desde arriba. A continuación, encontramos que hay una instrucción de asignación getName = function () {console.log (4);}, y luego se reasigna nuestro getName. En este punto, nuestra pregunta es

  getName = function() {
            console.log(4);

        }

        function Foo() {
            getName = function() {
                console.log(1);

            }
            return this;
        }
        Foo.getName = function() {
            console.log(2);

        };
        Foo.prototype.getName = function() {
            console.log(3);

        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • dieciséis
  • 17
  • 18
  • 19
  • 20

Primera pregunta Foo.getName (); // 2

Esto es equivalente a llamar al método estático de getName en el constructor de Foo, así que aquí hay 2

La segunda pregunta getName (); // 4

Obviamente estamos buscando el método getName global. Del análisis anterior, podemos ver que el getName global ejecuta la salida 4, por lo que aquí imprime 4

La tercera pregunta Foo (). GetName (); // 1

Esta pregunta se divide en dos pasos

  • Primero, cuando ejecutamos Foo () de izquierda a derecha, ya que el getName dentro de foo no es declarado por var, y no hay un parámetro formal para declararlo, entonces aquí el getName = function () {console.log (1) global ;}, Y esto vuelve a apuntar a la ventana, por lo que lo siguiente es equivalente a window.getName ()
  • Del paso anterior, podemos saber que el getName en el global ha cambiado, y la ejecución de Foo apunta al global, por lo que aquí encontramos el getName en el global, apuntando a 1, así que aquí está la salida 1

Cuarta pregunta getName (); // 1

Esto se basa en la tercera pregunta. La tercera pregunta ha cambiado el getName global, por lo que da como resultado 1 aquí, así que no diré más

La quinta pregunta es new Foo (). GetName (); //

En esta pregunta, se crea un nuevo Foo () de izquierda a derecha. Cuando es nuevo, apunta a nuestro nuevo objeto, y como Foo () no tiene un método con this.getName, lo buscamos en la cadena de prototipos. Por lo tanto, se encuentra Foo.prototype.getName = function () {console.log (3);}, por lo que la salida es 3 aquí

Foo sexto pregunta new new (). Proto .getName (); 3 //

Para esta pregunta, podemos ver esta imagen.
Inserte la descripción de la imagen aquí

Lo anterior es equivalente a Foo.prototype.getName (); así que aquí obtienes 3 directamente;

Séptima pregunta new Foo.getName (); // 2

Aquí para ir al principio y al final, mire primero el medio, lo que obtuve es Foo.getName = function () {console.log (2);} ;, así que aquí imprime 2, podemos ver que la consola imprime
Inserte la descripción de la imagen aquí
un formato normal función nueva e imprimirla El resultado sigue siendo la salida original, por lo que aquí el resultado impreso es 2

Una última pregunta new new Foo (). GetName (); // 3

Desde adentro hacia afuera, encontramos que esta pregunta es equivalente a new Foo (). GetName, que es equivalente a la quinta pregunta. Aplicando el método de la pregunta anterior, el resultado de new here sigue siendo 3.

para resumir

Cuando trabaje en el tema de la cadena de prototipos, puede dibujar un diagrama de prototipo simple.Cuando se trata de esto, tenga en cuenta que new apunta al nuevo objeto de nuevo.

Supongo que te gusta

Origin blog.csdn.net/L_Z_jay/article/details/111401329
Recomendado
Clasificación