Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

alternative for the deprecated __proto__ [duplicate]

Tags:

javascript

Granted I'm a javascript noob (at best). The following code seems to work fine. Any ideas how to keep the same "initializer" approach and make it work without using __proto__ and without converting everything to constructor functions?

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

I do have one approach that works, but I'm wondering if there is a more efficient approach. For now, what I have done is replace the lines that reference __proto__ with a call to my own inheritence function like this.

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

And this is my inherit() function

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);
    }
like image 769
John Carter Avatar asked Sep 22 '11 05:09

John Carter


1 Answers

Object.getPrototypeOf

// old-way
obj.__proto__

// new-way
Object.getPrototypeOf(obj)
like image 99
schettino72 Avatar answered Oct 20 '22 03:10

schettino72