原型继承

假设我们有一个名为 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 属性来破坏此页面。