2012-06-25 18 views
5

tengo alguna clase de pruebaCómo configurar nombre de la clase de objeto JavaScript

TestKlass = (function() { 

    function TestKlass(value) { 
     this.value = value != null ? value : 'hello world'; 
     console.log(this.value); 
    } 

    return TestKlass; 

})(); 

x = new TestKlass; 
x instanceof TestKlass; (gives true) 

tengo nuevo objeto vacío

y = {} 
y instanceof Object 

puedo encontrar ningún formas de configurar las propiedades de y, algo como esto

y.__proto__ = x.__proto__ 
y.constructor.prototype = x.constructor.prototype 

para tener este resultado

y instanceof TestKlass => true 

============================================ ========

UPD:

So. Mi objetivo principal es crear la función CLONE. Ahora mi solución funciona para mí. Por favor, mire este código:

JavaScript JS objeto clon

Object._clone = function(obj) { 
    var clone, property, value; 
    if (!obj || typeof obj !== 'object') { 
    return obj; 
    } 
    clone = typeof obj.pop === 'function' ? [] : {}; 
    clone.__proto__ = obj.__proto__; 
    for (property in obj) { 
    if (obj.hasOwnProperty(property)) { 
     value = obj.property; 
     if (value && typeof value === 'object') { 
     clone[property] = Object._clone(value); 
     } else { 
     clone[property] = obj[property]; 
     } 
    } 
    } 
    return clone; 
}; 

CoffeeScript JS objeto clon

# Object clone 
Object._clone = (obj) -> 
    return obj if not obj or typeof(obj) isnt 'object' 
    clone = if typeof(obj.pop) is 'function' then [] else {} 

    # deprecated, but need for instanceof method 
    clone.__proto__ = obj.__proto__ 

    for property of obj 
    if obj.hasOwnProperty property 
     # clone properties 
     value = obj.property 
     if value and typeof(value) is 'object' 
     clone[property] = Object._clone(value) 
     else 
     clone[property] = obj[property] 

    clone 

Ahora usted puede tratar de hacer que

A = new TestKlass 
B = Object._clone(A) 
B instanceof TestKlass => true 

Está bien el trabajo con Moz FF 13. Pero creo que no es un navegador cruzado. y proto está en desuso.

Creo que no hay una solución universal. Pero tal vez será útil para alguien.

+0

'y.constructor = x.constructor'? Solo una suposición ... Realmente, sin embargo, no deberías preocuparte por los tipos. Quiero decir, si hay una manera fácil de fingirlos, ¿de qué sirven en absoluto? – cHao

+0

¿Las respuestas le proporcionan suficiente información? Si es así, ¿podría amablemente aceptar una respuesta? :-) –

+0

Estoy buscando la mejor solución. Voy a marcar la mejor respuesta después de aprender profundamente esta página http://javascript.ru/tutorial/object/inheritance (ruso) –

Respuesta

1

Tal vez usted debe leer la primera answer siguiente. Lo que estás tratando de lograr es realmente simple. Sin embargo antes de explicar veamos sus soluciones:

Solución 1

y.__proto__ = x.__proto__; 

No recomendaría hacer esto ya que la propiedad es ahora __proto__deprecated. El código anterior no funcionará en Rhino.

Solución 2

y.constructor.prototype = x.constructor.prototype; 

Esta es una muy mala solución. La razón es que y.constructor es en realidad y.__proto__.constructor y dado que y es un objeto y.__proto__ es lo mismo que Object.prototype.Esto significa que y.constructor es lo mismo que Object y esencialmente está cambiando la propiedad prototype de Object. Esto podría potencialmente romper otro código en su página. Desanimo firmemente esta práctica.

Solución 3 (mi solución)

Lo que se quiere hacer es simplemente cambiar el [[proto]] propiedad interna de un objeto. Dado que no existe una forma de plataforma cruzada para hacerlo, necesitamos emplear un truco. Una solución simple sería crear un nuevo objeto con la propiedad deseada __proto__ y establecer getters y setters en él para cambiar el objeto original. Sería la siguiente manera:

function setPrototypeOf(object, prototype) { 
    var constructor = function() { 
     for (var key in object) { 
      if (object.hasOwnProperty(key)) { 
       (function (key) { 
        Object.defineProperty(this, key, { 
         get: function() { 
          return object[key]; 
         }, 
         set: function (value) { 
          object[key] = value; 
         }, 
         enumerable: true 
        }); 
       }).call(this, key); 
      } 
     } 
    }; 

    constructor.prototype = prototype; 

    return new constructor; 
} 

Después de esto todo lo que necesita hacer es:

y = setPrototypeOf(y, TestKlass.prototype); 

Aquí es una fiddle de trabajo.

Editar:

El problema con la función de la copia es que sólo los clones objetos y matrices. Olvidó contabilizar funciones que también se pasan por referencia. Por lo tanto, cuando clona un objeto que tiene métodos que close over el estado interno del objeto, el objeto y su clon compartirán el mismo estado interno. Véase el siguiente fiddle:

function Value(value) { 
    this.get = function() { 
     alert(value); 
    }; 
    this.set = function (newValue) { 
     value = newValue; 
    }; 
} 

var a = new Value(5); 
var b = Object._clone(a); 
b.set(10);    // setting b to 10 also sets a to 10 
a.get();     // alerts 10, should alert 5 

No hay absolutamente ninguna manera en JavaScript para clonar el estado interno de un objeto de modo clonación de objetos y arrays en JavaScript sólo funcionará para los objetos que no expongan los cierres como los métodos.

Para saber más acerca de los problemas con la clonación de objetos en JavaScript, lea esto answer. Haga clic en el siguiente link para leer la respuesta de John Resig.

1

obj instanceof SomeConstructor comprueba si SomeConstructor se encuentra en cualquier lugar de la cadena prototipo de obj.

Si desea heredar, debe establecer el .prototipo de FirstConstructor en un objeto SomeConstructor de nueva creación.

SomeConstructor = function() {} 
FirstConstructor = function() {} 
FirstConstroctor.prototype = new SomeConstructor(); 

var y = new FirstConstroctor(); 
y instanceof FirstConstructor; // true 
y instanceof SomeConstructor ; // true, it bubbles from FirstConstructor.__proto__ to SomeConstructor 
Cuestiones relacionadas