2011-09-22 14 views
14

Zgoda Jestem javascript noob (w najlepszym wypadku). Poniższy kod wydaje się działać dobrze. Wszelkich pomysłów, jak zachować ten sam "inicjator" podejście i sprawiają, że działa bez korzystania z __proto__ i bez konwertowania wszystkiego do funkcji konstruktora?alternatywa dla przestarzałego __proto__

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(); 

Mam jedno podejście, które działa, ale zastanawiam się, czy istnieje bardziej wydajne podejście. Na razie, zamieniłem linie, które odwołują się do __proto__ z wywołaniem mojej własnej funkcji dziedziczenia w ten sposób.

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

A to moja dziedziczą funkcja()

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

ten może ci pomóc: http://www.webdeveasy.com/javascript-prototype/ – Naor

Odpowiedz

8

Dlaczego nie używać standardowych funkcji JavaScript dziedziczenia? Na przykład:

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

Cóż, myślę, że "Noob" był kluczem do mojego myślenia. Myślałem, że przyjmuję podejście bardziej przyjazne dla JSON, ale wyraźnie to, co sugerujesz, jest najlepsze. Pochodzę z tła Objective-C, więc ciężko jest mi sprawić, by ten prototypowy język zachowywał się obiektowo. Dzięki –

0

__proto__ będzie w ES6, więc może jeśli czytasz to teraz, nie powinno to potrzebne, ale nadal dobrze wiedzieć

+1

"__proto__" jest przestarzałe w ES6. Określili swoje zachowanie tylko ze względu na starsze wersje. – Bergi

24

Object.getPrototypeOf

// old-way 
obj.__proto__ 

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

Jaki byłby odpowiednik .__ proto__ = b? –

+0

@ GuidoGarcía: ['Object.setPrototypeOf'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf) (lub właściwie' Reflect.setPrototypeOf' od ES6) – Bergi

Powiązane problemy