Supongamos que tengo un Foo objeto

¿Cómo puedo extender este objeto mediante la adición de un bar() método y también asegurarse de que las futuras instancias de Foo tiene este método?

InformationsquelleAutor Chin | 2012-11-23

4 Comentarios

  1. 66

    necesita agregar a Foo del prototipo:

    function Foo(){}
    Foo.prototype.bar = function(){}
    var x = new Foo()
    x.bar()
  2. 55

    Todo esto depende de cómo se está creando Foo, y cómo va a utilizar .bar().

    Primero, utilizando un constructor función de su objeto?

    var myFoo = new Foo();

    Si es así, entonces usted puede extender la Foo función del prototype propiedad con .bar, así:

    function Foo () { /*...*/ }
    Foo.prototype.bar = function () { /*...*/ };
    
    var myFoo = new Foo();
    myFoo.bar();

    De esta forma, cada instancia de Foo ahora tiene acceso a la MISMO instancia de .bar.

    A saber: .bar tendrá acceso COMPLETO a this, pero tendrá absolutamente ningún acceso a variables dentro de la función de constructor:

    function Foo () { var secret = 38; this.name = "Bob"; }
    Foo.prototype.bar = function () { console.log(secret); };
    Foo.prototype.otherFunc = function () { console.log(this.name); };
    
    var myFoo = new Foo();
    myFoo.otherFunc(); //"Bob";
    myFoo.bar(); //error -- `secret` is undefined...
                 //...or a value of `secret` in a higher/global scope

    De otra manera, se podría definir una función para devolver cualquier objeto (no this), con .bar creado como una propiedad de ese objeto:

    function giveMeObj () {
        var private = 42,
            privateBar = function () { console.log(private); },
            public_interface = {
                bar : privateBar
            };
    
        return public_interface;
    }
    
    var myObj = giveMeObj();
    myObj.bar(); //42

    De esta manera, tiene una función que crea nuevos objetos.

    Cada uno de los objetos tiene un .bar función creada para ellos.

    Cada .bar función tiene acceso, a través de lo que se llama cierre, a la «privada» de las variables dentro de la función que devuelve su objeto en particular.

    Cada .bar todavía tiene acceso a this así, como this, al llamar a la función como myObj.bar(); siempre se refiere a myObj (public_interface, en mi ejemplo Foo).

    La desventaja de este formato es que si usted va a crear millones de estos objetos, que también millones de copias de .bar, que va a comer en la memoria.

    Podría también hacerlo en el interior de una función constructora, la configuración de this.bar = function () {}; dentro del constructor, de nuevo, al revés sería el cierre de acceso a las variables privadas del constructor y de la desventaja sería el aumento de los requisitos de memoria.

    Así que la primera pregunta es:

    ¿Usted espera que sus métodos para tener acceso a leer/modificar «privado» de los datos, de la cual no se puede acceder a través del objeto en sí mismo (a través de this o myObj.X)?

    y la segunda pregunta es:
    Estás haciendo lo suficiente de estos objetos, así que la memoria va a ser una gran preocupación, si se les da a cada uno su propia función, en vez de darles una para compartir?

    Por ejemplo, si usted le dio a cada triángulo y cada textura de su propia .draw función en un high-end 3D juego, que podría ser una exageración, y es probable que afectan a la tasa de fotogramas en un sistema delicado…

    Sin embargo, si usted está mirando para crear 5 barras de desplazamiento por la página, y usted quiere que cada uno sea capaz de establecer su posición y mantener un seguimiento de si está siendo arrastrado, sin dejar que cada solicitud se tiene acceso de lectura/conjunto de esas mismas cosas, entonces no hay realmente ninguna razón para tener miedo de que 5 funciones adicionales se va a matar a su aplicación, asumiendo que ya podría ser de 10.000 líneas de largo (o más).

  3. 12

    Hay muchas maneras de crear re-utilizable objetos como este en JavaScript. Mozilla tiene una buena introducción aquí:

    El siguiente será trabajar en su ejemplo:

    function Foo(){
        this.bar = function (){
            alert("Hello World!");
        }
    }
    
    myFoo = new Foo();
    myFoo.bar(); //Hello World​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
  4. 7

    Puede hacer que la barra de una función de lo que es un método.

    Foo.bar = function(passvariable){  };

    Como una propiedad que acaba de ser asignado a una cadena, el tipo de datos o valor booleano

    Foo.bar = "a place";

Dejar respuesta

Please enter your comment!
Please enter your name here