原型继承
假设我们有一个名为 prototype
的普通对象:
var prototype = { foo: 'foo', bar: function () { return this.foo; } };
现在我们想要另一个名为 obj
的对象继承自 prototype
,这就像说 prototype
是 obj
的原型一样
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
属性来破坏此页面。