設定物件原型

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。