2010-06-20 20 views
14

¿Cómo heredo con Object.create()? Yo probé estos, pero ninguno de ellos está trabajando:Herencia de JavaScript con Object.create()?

var B = function() {}; 
var A = function() {}; 
A = Object.create(B); 
A.prototype.C = function() {}; 

y

var B = function() {}; 
var A = function() {}; 
A.prototype.C = function() {}; 
A = Object.create(B); 

y

var B = function() {}; 
A = Object.create(B); 
var A = function() {}; 
A.prototype.C = function() {}; 

Nada funcionó. ¿Cómo se supone que debo usar esta nueva función Object.create() -?

+0

posible duplicado de [Usando "Object.create" en lugar de "nuevo"] (http://stackoverflow.com/questions/2709612/using-object-create-instead-of-new) – Bergi

Respuesta

21

Object.create() se utiliza para heredar objetos, no constructores como que está tratando de hacer. Más o menos crea un nuevo objeto con el antiguo conjunto de objetos como su padre prototipo.

var A = function() { }; 
A.prototype.x = 10; 
A.prototype.say = function() { alert(this.x) }; 

var a = new A(); 
a.say(); //alerts 10 

var b = Object.create(a); 
b.say(); //alerts 10 
b.x = 'hello'; 
b.say(); //alerts 'hello' 

Y sólo para asegurarse de que b no es sólo un clon de una,

a.x = 'goodbye'; 
delete b.x; 
b.say(); //alerts 'goodbye' 
+0

Maldición, entonces no se ajusta a mi situación. Necesito definir una "clase" que amplíe otra "clase". – Tower

+0

El punto de la herencia prototípica es que no tiene una distinción difícil entre una "clase" y un "objeto", ya que una clase también es un objeto. – Kos

+0

Ojalá hubiera 'Object.clone (obj)' que produciría el mismo resultado que 'JSON.parse (JSON.stringify (obj))'. – trusktr

0

La documentación original para Douglas Object.create es aquí http://javascript.crockford.com/prototypal.html. Asegúrese de que ha incluido la definición del método

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 
+0

.. no se recomienda el uso de esa implementación, consulte: http://stackoverflow.com/questions/5199126/javascript-object-create-not-working-in-firefox – zack

0

Puede definir Object.create a sí mismo, pero si no es nativo tendrá que tratar con él empadronado en todos en el bucle se utiliza para los objetos .

Hasta ahora, sólo nueva webkits- Safari5 y Chrome de forma nativa apoyarlo.

+3

'Object.create' es una propiedad de' Object', no de 'Object.prototype', por lo que definirlo usted mismo no lo agregaría a la lista de propiedades enumeradas en todos los objetos. – kpozin

16

El patrón de uso de esto es para envolver cada tipo en un módulo, y exponer create y prototype propiedades, así:

var Vehicle = (function(){ 
     var exports = {}; 
     exports.prototype = {}; 
     exports.prototype.init = function() { 
       this.mph = 5; 
     }; 
     exports.prototype.go = function() { 
       console.log("Going " + this.mph.toString() + " mph."); 
     }; 

     exports.create = function() { 
       var ret = Object.create(exports.prototype); 
       ret.init(); 
       return ret; 
     }; 

     return exports; 
})(); 

Entonces puede construir tipos derivados de este modo:

var Car = (function() { 
     var exports = {}; 
     exports.prototype = Object.create(Vehicle.prototype); 
     exports.prototype.init = function() { 
       Vehicle.prototype.init.apply(this, arguments); 
       this.wheels = 4; 
     }; 

     exports.create = function() { 
       var ret = Object.create(exports.prototype); 
       ret.init(); 
       return ret; 
     }; 

     return exports; 

})(); 

con este patrón, cada tipo tiene su propia función create().

+0

Seguimiento: Estos días uso Coffeescript si siento la necesidad de hacer cosas de clase, o un objeto anónimo si no lo hago. –

26

Hay varias formas de hacer herencia en JavaScript

construcción Herencia. Se utiliza si no es necesario llamar constructor supertipo:

function Rectangle(length, width) { 
    this.length = length; 
    this.width = width; 
} 

Rectangle.prototype.getArea = function() { 
    return this.length * this.width; 
}; 

// inherits from Rectangle 
function Square(size) { 
    this.length = size; 
    this.width = size; 
} 

Square.prototype = Object.create(Rectangle.prototype); 

var rect = new Rectangle(6, 8); 
var square = new Square(10); 

console.log(rect.getArea());    // 48 
console.log(square.getArea());    // 100 
console.log(rect instanceof Rectangle);  // true 
console.log(rect instanceof Object);  // true 
console.log(square instanceof Square);  // true 
console.log(square instanceof Rectangle); // true 
console.log(square instanceof Object);  // true 

El robo Constructor. Se utiliza si hay necesidad de llamar constructor supertipo:

function Rectangle(length, width) { 
    this.length = length; 
    this.width = width; 
} 

Rectangle.prototype.getArea = function() { 
    return this.length * this.width; 
}; 

// inherits from Rectangle 
function Square(size) { 
    Rectangle.call(this, size, size); 
} 

Square.prototype = Object.create(Rectangle.prototype); 

var rect = new Rectangle(6, 8); 
var square = new Square(10); 

console.log(rect.getArea());    // 48 
console.log(square.getArea());    // 100 
console.log(rect instanceof Rectangle);  // true 
console.log(rect instanceof Object);  // true 
console.log(square instanceof Square);  // true 
console.log(square instanceof Rectangle); // true 
console.log(square instanceof Object);  // true 
+0

Veo Square.prototype.constructor = Square; en algún lugar, no es necesario? – c0ming

0

Bueno, es años de retraso, pero para nadie más tropezar con esto. Puedes usar Object.assign en FF y Chrome.

En este ejemplo, cuando el cubo está siendo hecho con crear. En primer lugar Object.create (esto) crea el objeto con la propiedad z, luego con Object.assign (obj, Square.create (x, y)) se llamará a la Square.create y volver y añadir que en Cubo de ser almacenado en obj .

var Square = { 
     x: 0, 
     y: 0, 

     create: function(x,y) { 
      var obj = Object.create(this); 
      obj.x = x; 
      obj.y = y; 
      return obj; 
     } 
    }; 

var Cube = { 

     z: 0, 

     create:function(x,y,z) { 
      var obj = Object.create(this); 
      Object.assign(obj, Square.create(x,y)); // assign(target,sources...) 
      obj.z = z; 
      return obj; 
     } 
    }; 

// Your code 
var MyCube = Cube.create(20,30,40); 
console.log(MyCube); 
Cuestiones relacionadas