原型繼承

假設我們有一個名為 prototype 的普通物件:

var prototype = { foo: 'foo', bar: function () { return this.foo; } };

現在我們想要另一個名為 obj 的物件繼承自 prototype,這就像說 prototypeobj 的原型一樣

var obj = Object.create(prototype);

現在 prototype 的所有屬性和方法都可用於 obj

console.log(obj.foo);
console.log(obj.bar());

控制檯輸出

"foo"
"foo"

原型繼承是通過內部的物件引用進行的,物件是完全可變的。這意味著你對原型所做的任何更改都會立即影響原型為其原型的所有其他物件。

prototype.foo = "bar";
console.log(obj.foo);

控制檯輸出

"bar"

Object.prototype 是每個物件的原型,所以強烈建議你不要亂用它,特別是如果你使用任何第三方庫,但我們可以稍微玩一下。

Object.prototype.breakingLibraries = 'foo';
console.log(obj.breakingLibraries);
console.log(prototype.breakingLibraries);

控制檯輸出

"foo"
"foo"

有趣的事實我已經使用瀏覽器控制檯來製作這些示例並通過新增 breakingLibraries 屬性來破壞此頁面。