2011-08-10 19 views
5

¿Hay un objeto JavaScript que no sea una función?¿Es cada objeto de JavaScript una función?

javascript: x=y=z=Object; alert([window.navigator.userAgent,x,y,z].join("\n\n")) 

(Hubo un comment que x, y, z no son más que referencias en cuyo caso Object también es simplemente una referencia a function Object(){ ... } porque el valor Object 's se asigna a x y son la 'misma'. Como "prueba"

javascript:x=Object;x.p=43;alert([x==Object,x===Object,x.p,Object.p]) 

pantallas

true,true,43,43 

Dado function Thing(){} ¿x=new Thing() hace x un objeto o una referencia a uno? ¿Qué hay de new Thing() y Thing? O y en y=x=new Thing() o y=x=Thing? ¿Qué pasa si Thing=function(){}? La distinción es discutible. "Todo" (¿o lo es?) Se llama por referencia, pero la llamada por nombre se puede forzar mediante la evaluación de cadenas. . Así que ...)

javascript: 
    void function(x,y,z){ 
     alert( [window.navigator.userAgent,x,y,z].join("\n\n")) 
    }(Object,Object,Object) 

o

javascript: 
    void function(x){ (function (y){ (function (z){ 
      alert( [window.navigator.userAgent,x,y,z].join("\n\n")) 
     })(y) })(x) }(Object) 

(así no es discutible - los valores function 's deben ser obligados usando (...) o void Los matices de (...) son sutiles:

javascript:  /* 43.p gives a runtime error but not ... */ 
    alert([ (43).p=34, 43["q"]=17, (x=43).z="hmmm" ]); 
    alert([ 43["p"], (43).z, x.p, x["z"], x]); 

pantallas 34,17,hmmm y ,,,,43

)

o incluso una matriz de objetos

javascript:alert([window.navigator.userAgent,Object,Object,Object].join("\n\n")) 

da:

Mozilla/5.0 (X11; U; Linux i686; en-US; rv: 1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucidez) Firefox/3.6.3

función Object() { [código nativo]}

función Object() { [código nativo]}

función Object() { [código nativo]}

Hay muchos objetos que no son objeto.


Como se señala en una de las answers, a objeto no puede ser a sí mismo si se modifica.
¡Peligro! ¡Peligro! Will Robinson!

x=y=z=Object=null; alert([window.navigator.userAgent,Object,x,y,z].join("\n\n")); 

referencias

+1

una función es un objeto – Ibu

+1

@Ibu ... pero no todos los objetos son funciones ;-) –

+2

@pst, gracias por terminar mi frase – Ibu

Respuesta

6

No ha creado objetos, creados referencias a la función del objeto. Si quería esos objetos a ser usted puede hacer esto:

x = y = z = {} 

Entonces alert(x) volverá object [Object].

Para (con suerte) abarcar los comentarios - de forma predeterminada Object es una función que construye Objetos. Si reasigna el nombre Object (Firefox al menos parece permitirme, no ha probado todos los navegadores) entonces Object ya no será una función, será lo que le asignó. Entonces, la respuesta es "no", Object no es siempre a Función, pero debe ser a menos que haya sido explícitamente re-declarado. De acuerdo con Firebug:

>>> Object 
Object() 
>>> Object = {} 
Object {} 
>>> Object 
Object {} 

Aparentemente se puede reasignar. No puedo responder sobre qué tipo de impactos tendría, si los hubiera.

+1

Dale un golpe ... sin embargo , No me gusta el uso de "referencias" cuando hablo de JavaScript (y aquí está mi sugerencia de cómo leer/frasear la primera oración): No creaste objetos [nuevos], asignaste la * función * Objeto [que es un constructor] a las variables. –

+0

Esa es una buena manera de decirlo también, definitivamente. La clave es que puede crear Objetos que no son Funciones, pero no asignando la Función de Objeto a una variable. :) –

+0

sí, sí ... pero ... ¿Hay un Objeto que no sea una función? Tenga en cuenta el fraseo y la sintaxis cuidadosos. "Objeto" en mayúscula y ningún artículo "an". Me refiero a la entidad "Objeto". ¿Hay uno (Objeto) que no sea una función? La pregunta no era sobre crear objetos. – Ekim

2

Está asignando el constructor de objetos a los valores x, y y z. Si en cambio dice x=new Object(), ya no los verá como funciones.

+0

exactamente - pero aún queda la pregunta - ¿La respuesta es "SÍ"? – Ekim

+0

@ekim Los objetos y las funciones son los dos elementos raíz, no primitivos de Javascript https://developer.mozilla.org/en/JavaScript/Guide/Values,_Variables,_and_Literals – Shad

+0

https://developer.mozilla.org/ es/JavaScript/Guide/Functions y https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects describe los fundamentos de construcción. – Ekim

0

Aquí hay una manera segura de verificar el tipo de cualquier cosa en js.

nota: usted debe enviar en algo que no sea la ventana ...

try it out here...

  (function (self) { 
       var values = [ 
          'Function', 
          'Object', 
          'Array', 
          'String', 
          'Number', 
          'Date', 
          'RegExp', 
          'Boolean', 
          'Null', 
          'Error' 
        ]; 

       for (var i in values) if (values.hasOwnProperty(i)) { 
        var value = values[i]; 

        self['is' + value] = (function (v) { 
          return function (o) { 
           var r = ''; 

           try { 
            r = (o === null) ? 
               'Null' : 
               Object.prototype.toString.call(o).replace(/^\[object\s(\w+)\]$/, '$1'); 
           } catch (e) { 
            r = 'Undefined'; 
           } 

           return !!(r === v); 
          }; 
        })(value); 
       } 
      })(window); 

      alert(isFunction(Object)); 
+0

la pregunta no necesita examinar el tipo - pregunta "¿El objeto siempre es una función?" – Ekim

+0

¿intentó ejecutarlo? ;) – shawndumas

+0

sí, pero 'javascript: alert ([Object, typeof (Object)])' es más elemental – Ekim

1

Cualquier función puede utilizarse como un constructor para crear un objeto mediante el operador new antes de que el nombre de la función en JavaScript El objeto resultante no será un Function.

También hay una relación circular entre Object y Function que puede ser probado con:

Object instanceof Function // true 
Function instanceof Object // true 

Y {} y Object no son lo mismo, pero {} y new Object() son.

function foo() {} 
foo instanceof Function // true 
foo instanceof Object // true 

var bar = new foo(); 
bar instanceof Function // false 
bar instanceof Object // true 

var baz = {}; 
baz instanceof Function; // false 
baz instanceof Object; // true 
+0

No hay una "relación circular". El objeto y la función son ambas funciones, ambas heredan de Function.prototype, que a su vez hereda de Object.prototype (por lo que ambas son funciones, y todas las funciones de javascript también son objetos). El operador * instanceOf * simplemente verifica la cadena del prototipo, realmente no dice mucho. – RobG

+0

entonces ... la respuesta simple es ... ¿es eso un SÍ ?, CADA Objeto (aunque solo hay uno que conozco pero hay este) ¡ES una función! – Ekim

+0

"Cualquier función ... usada como constructor para crear un objeto usando el operador' new' ... no será 'Función'" no es verdad, prueba: 'javascript: función f() {función de retorno() {}}; alerta (nueva f) ' – Ekim

Cuestiones relacionadas