2011-09-22 16 views
14

Concedido que soy un novato de JavaScript (en el mejor de los casos). El siguiente código parece funcionar bien. ¿Alguna idea de cómo mantener el mismo enfoque de "inicializador" y hacerlo funcionar sin usar __proto__ y sin convertir todo a funciones de constructor?alternativa para el __proto__ en desuso

var Employee = 
    { 
    paygrade: 1, 
    name: "", 
    dept: "general", 

    init: function() 
     { 
     return this; 
     }, 

    salary: function() 
     { 
     return this.paygrade * 30000; 
     } 
    }; 



var WorkerBee = 
    { 
    paygrade: 2, 
    projects: ["Project1", "Project2"], 

    init: function() 
     { 
     this.__proto__ = Inherit_Employee; // Inherit My Employee "Pseudo Prototype" 
     return this; 
     } 
    }; 


var SalesPerson = 
    { 
    dept: "Sales", 
    quota: 100, 

    init: function() 
     { 
     this.__proto__ = Inherit_WorkerBee; // Inherit My WorkerBee "Pseudo Prototype" 
     return this; 
     } 
    }; 


var Engineer = 
    { 
    dept: "Engineering", 
    machine: "im the start machine", 

    init: function() 
     { 
     this.__proto__ = Inherit_WorkerBee; // Inherit My WorkerBee "Pseudo Prototype" 
     return this; 
     } 
    }; 


var Inherit_Employee = Object.create(Employee).init();  // Create My Employee Pseudo-Prototype 
var Inherit_WorkerBee = Object.create(WorkerBee).init(); // Create My WorkerBee Pseudo-Prototype 


var jane = Object.create(Engineer).init(); 
var jill = Object.create(Engineer).init(); 

Tengo un enfoque que funciona, pero me pregunto si hay un enfoque más eficiente. Por ahora, lo que he hecho es reemplazar las líneas que hacen referencia a __proto__ con una llamada a mi propia función heredada de esta manera.

init: function() 
     { 
     inherit(this, WorkerBee); // Inherit WorkerBee 
     return this; 
     } 

Y esto es) función (

function inherit(childObject, parentObject) 
    { 
    // childObject inherits all of parentObjects properties 
    // 
    for (var attrname in parentObject) 
     if (childObject[attrname] == undefined) 
      childObject[attrname] = parentObject[attrname]; 

    // childObject runs parentObject 'init' function on itself 
    // 
    for (var attrname in parentObject) 
     if (typeof parentObject[attrname] == "function") 
      if (attrname == 'init') 
       parentObject[attrname].call(childObject); 
    } 
+0

Este podría ayudarte: http://www.webdeveasy.com/javascript-prototype/ – Naor

Respuesta

8

¿Por qué usted no utiliza la herencia función de JavaScript estándar mi hereda? Por ejemplo:

function inherit(childClass,parentClass) { 
    var f=function(){}; // defining temp empty function 
    f.prototype=parentClass.prototype; 
    f.prototype.constructor=f; 

    childClass.prototype=new f; 

    childClass.prototype.constructor=childClass; // restoring proper constructor for child class 
    parentClass.prototype.constructor=parentClass; // restoring proper constructor for parent class 
} 


Employee = function Employee(/*list of constructor parameters, if needed*/) { 
} 
Employee.prototype.paygrade = 1; 
Employee.prototype.name = ""; 
Employee.prototype.dept = "general"; 
Employee.prototype.salary = function() { 
    return this.paygrade * 30000; 
} 


WorkerBee = function WorkerBee(/*list of constructor parameters, if needed*/) { 
    this.projects = ["Project1", "Project2"]; 
} 
inherit(WorkerBee,Employee); // for this implementation of *inherit* must be placed just after defining constructor 
WorkerBee.prototype.paygrade = 2; 
WorkerBee.prototype.projects = null; // only literals and function-methods can properly initialized for instances with prototype 


Engineer = function Engineer(/*list of constructor parameters, if needed*/) { 
} 
inherit(Engineer,WorkerBee); 
Engineer.prototype.dept = "Programming"; 
Engineer.prototype.language = "Objective-C"; 




var jane = new Engineer(/*Engineer parameters if needed*/); 
var jill = new Engineer(/*Engineer parameters if needed*/); 
var cow = new Employee(/*Employee parameters if needed*/); 
+0

Bueno, creo que "Noob" fue clave en mi forma de pensar. Pensé que estaba tomando un enfoque más amigable con JSON, pero claramente lo que sugieres es lo mejor. Vengo de un fondo de Objective-C, así que realmente me está costando conseguir que este lenguaje prototipo se comporte orientado a objetos. Gracias –

0

__proto__ estarán en ES6, así que tal vez si estás leyendo esto ahora, que no es necesario esto, pero aún así es bueno saber

+1

'__proto__' está en desuso en ES6. Han especificado su comportamiento solo por razones heredadas. – Bergi

24

Object.getPrototypeOf

// old-way 
obj.__proto__ 

// new-way 
Object.getPrototypeOf(obj) 
+0

¿Cuál sería el equivalente de un .__ proto__ = b? –

+0

@ GuidoGarcía: ['Object.setPrototypeOf'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf) (o en realidad' Reflect.setPrototypeOf' desde ES6) – Bergi