Skip to content
This repository has been archived by the owner on Sep 25, 2023. It is now read-only.
/ proto-polyfill Public archive

Provide __proto__ with some limitations

License

Notifications You must be signed in to change notification settings

webcarrot/proto-polyfill

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

proto-polyfill · GitHub license npm version

Provide __proto__ with some limitations

browsers that need this polyfill

In general old browsers that not provide legacy __proto__ and support Object.defineProperty, Object.getPrototypeOf, Object.getOwnPropertyNames, Object.getOwnPropertyDescriptor and Object.create:

  • IE 9
  • IE 10

IE 8 is not supported.

why and when

If you do things like: ./tests/class-like.js or (ES6 version):

class X {
  static get foo() {
    return "xFoo";
  }
  get foo() {
    return this.constructor.foo + " by instance!";
  }
}
X.s = { s: "x" };
X.f = "X";
class Y extends X {
  static get foo() {
    return this.__proto__.foo + " > yFoo";
  }
}
Y.s = {
  s: "y"
};
Y.f = "Y";
class Z extends Y {
  static get foo() {
    return this.__proto__.foo + " > zFoo";
  }
  get foo() {
    return "My special Z foo " + super.foo;
  }
}
Z.f = "Z";
var x = new X();
var y = new Y();
var z = new Z();
console.log(x.foo); // xFoo by instance!
console.log(y.foo); // xFoo > yFoo by instance!
console.log(z.foo); // My special Z foo xFoo > yFoo > zFoo by instance!
console.log(x.constructor.s.s); // x
console.log(x.constructor.f); // X
console.log(y.constructor.s.s); // y
console.log(y.constructor.f); // Y
console.log(z.constructor.s.s); // y
console.log(z.constructor.f); // Z

...and code produced by compliler ( babel 6.x ) not work properly in old browsers like ie9-10.

installation

npm install --save-dev proto-polyfill

And use like polyfill...

limitations

Look at ./tests/limitations.js

var x = {
  a: "xa"
};
function X() {}
X.prototype.a = "Xa";
X.prototype.cv = "XCV";
X.prototype.ab = function() {
  return "ab:" + this.a;
};
Object.defineProperty(X.prototype, "c", {
  get: function() {
    return this.ab() + ":" + this.cv;
  }
});
// no way to replace object prototype "in place" ?
x.__proto__ = X.prototype;
console.log(x instanceof X); // invalid log: false should true
// but some kind emulation works
console.log(x.a); // ok log: "xa";
console.log(x.ab()); // ok log: "ab:xa";
console.log(x.c); // ok log: "ab:xa:XCV";
// normal instance
var iX = new X();
console.log(iX instanceof X); // ok log: true
console.log(iX.a); // ok log: "Xa";
console.log(iX.ab()); // ok log: "ab:Xa";
console.log(iX.c); // ok log: "ab:Xa:XCV";
// override
X.prototype.cv = "XCV2";
console.log(x.c); // ok log: "ab:xa:XCV2";
x.cv = "XCV3";
console.log(x.c); // ok log: "ab:xa:XCV3";
// but
X.prototype.newProp = "newProp";
console.log(x.newProp); // invalid log: undefined should "newProp";

Pseudo Symbol()

Pseudo Symbol() props are skipped (core-js Set polyfill use it)

Object.setPrototypeOf

Only emultation

Object.getPrototypeOf

Override to make super() work in Babel 7

tests

./tests/index.html

PR welcome.