2012-09-16 12 views
5

así que creé una función como esta,crear función en Javascript con el prototipo de encargo

var functionName = function(arg1) { //code logic here; } 

Al mismo tiempo, necesito esta función para trabajar como un objeto. Realmente no guardará nada, pero se accederá a los datos desde otro objeto.

var myObj = new Object(); 
myObj.x = 3; 
myObj.y = 4; 

Así que cuando me vaya, functionName.x debe devolver myObj.x. El objeto myObj se está manteniendo en otro lugar y no tengo ningún control sobre él.

Es así como actualmente se implementé,

functionName.__proto__ = myObj; 

funciona bien. Pero __proto__ ya está en desuso y me gustaría ver si hay alguna otra forma segura de hacerlo. Pensé en anular Function.prototype pero no funciona.

+0

¿Por qué no solo almacena en ** functionName ** solo una referencia a ** myObj **? – Kryz

+0

@Kryz No estoy seguro Entiendo. No puedo hacer functionName = myObj cuz que anulará la definición de la función. Actualmente, se está accediendo a functionName como functionName() y functionName.x, así que necesito mantener el comportamiento. –

+0

Una observación al margen: myObj probablemente debería derivarse de Function.prototype, por lo que todavía tiene acceso a functionName.bind, etc. (Por supuesto, esto no tiene nada que ver con el problema original). – Marc

Respuesta

1

desea implementar un delegado a myObj:

 var functionName = function(arg1) { // code } 

    functionName.myObj = new MyObj(); 
    for (prop in functionName.myObj) { 
     if (functionName.myObj.hasOwnProperty(prop)) { 
     functionName.__defineGetter__(prop, function() { return functionName.myObj[prop]; }); 
     } 
    } 
+0

Lo que veo aquí es siempre functionName() se llama como una función, irá a través de cada elemento en myObj. Lo cual podría ser lento. Ese objeto podría contener hasta 500 elementos. Y, si functionName() nunca se llama, entonces los getters no serán definidos. Por ejemplo, algunas páginas simplemente usan functionName.x directamente sin usar functionName() –

+0

Supuse que functionName era un constructor. Actualizando la respuesta para trabajar para una función normal. –

+0

Creo que falta un punto aquí. myObj ya está definido en alguna parte y mantiene una colección de objetos que es dinámica. Es decir, podría perder u obtener más elementos en tiempo de ejecución. No puedo copiar el contenido a functionName porque una vez que myObj se actualiza, no estaría sincronizado con functionName.Necesito functionName, o su prototipo, para mantener una referencia a myObj. Esto funciona cuando hago functionName .__ proto__ = myObj pero necesito encontrar una alternativa a __proto__ use, –

-1

podría configurar el prototype de la función.

function functionName(arg1) { 
    //code logic here; 
} 

var myObj = { x: 3, y: 4 }; 
functionName.prototype = myObj; 

var obj = new functionName(); 
console.log(obj.x, obj.y); // will output 3, 4 
+0

Necesito acceder directamente desde functionName. El uso de functionName() y functionName.x está en diferentes páginas y no será lo suficientemente práctico para cambiar cada una. –

+1

Esto no responde la pregunta del OP en absoluto. El OP quiere crear una función con un '__proto__' personalizado. Esto no hace eso. Por lo tanto, debe ser eliminado. –

1

Estoy teniendo el mismo problema aquí. Desafortunadamente, no hay una buena solución en EcmaScript 5.1.

En la especificación de idioma http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf dice en 13.2 "Creación de objetos de función" que la propiedad interna [[Prototype]] de un objeto de función recién creado es siempre el objeto prototipo de función integrado estándar.

Como se detalla en 13.3 de la misma especificación, usar el constructor de función tampoco es de ayuda ya que una función construida por new Function(…) también utiliza el método detallado en 13.2. (Esto se refleja en el hecho de que la propiedad prototype de Function no es ni modificable ni configurable.

Así que para lograr lo que quiere, se necesita un método para cambiar el prototipo de objetos ya existentes. Afortunadamente, el próximo estándar ECMAScript 6 parece estandarizar Object.prototype.__proto__ según el anexo B.2.2 en el borrador reciente http://wiki.ecmascript.org/lib/exe/fetch.php?id=harmony%3Aspecification_drafts&cache=cache&media=harmony:working_draft_ecma-262_edition_6_05-14-13-nomarkup.pdf.

Cuestiones relacionadas