设置对象原型

Version >= 五

使用 ES5 +,Object.create 函数可用于创建具有任何其他 Object 的 Object 作为其原型。

const anyObj = {
    hello() {
        console.log(`this.foo is ${this.foo}`);
    },
};

let objWithProto = Object.create(anyObj);
objWithProto.foo = 'bar';

objWithProto.hello(); // "this.foo is bar"

要显式创建没有原型的 Object,请使用 null 作为原型。这意味着 Object 也不会从 Object.prototype 继承,并且对于用于存在检查字典的对象很有用,例如

let objInheritingObject = {};
let objInheritingNull = Object.create(null);

'toString' in objInheritingObject; // true
'toString' in objInheritingNull ; // false

Version >= 6

例如,从 ES6 开始,可以使用 Object.setPrototypeOf 更改现有 Object 的原型

let obj = Object.create({foo: 'foo'});
obj = Object.setPrototypeOf(obj, {bar: 'bar'});

obj.foo; // undefined
obj.bar; // "bar"

这几乎可以在任何地方完成,包括在 this 对象或构造函数中。

注意: 此过程在当前浏览器中非常慢,应该谨慎使用,尝试使用所需的原型创建 Object。

Version < 五

在 ES5 之前,使用手动定义的原型创建 Object 的唯一方法是使用 new 构建它

var proto = {fizz: 'buzz'};

function ConstructMyObj() {}
ConstructMyObj.prototype = proto;

var objWithProto = new ConstructMyObj();
objWithProto.fizz; // "buzz"

这种行为非常接近于可以编写 polyfill。