我们可能会认为在任何时候完全替换prototype属性,并且所有的实例都将更新,这是不正确的。创建一个实例时,该实例将在实例化时被绑定至‘刚完成的’原型。提供一个新对象作为prototype属性不会更新已创建实例和新原型之间的连接。但是要记住,可以更新或添加最初创建的原型对象,这些值仍连接至第一个实例。如下面一段代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>用新对象替换prototype属性不会更新以前的实例</title>
</head>
<body>
<script>
var Bar=function Bar(){};
Bar.prototype.x=1;
var BarInstance=new Bar();
console.log(BarInstance.x); //输出1
//使用新Object()对象覆盖Bar的原型
Bar.prototype={x:2};
console.log(BarInstance.x); //刚刚更新了原型,但还是输出1
//BarInstance依然引用的是初始化的原型对象
//再创建Bar()的一个新实例
var NewBarInstance=new Bar();
//该实例目前引用的就是新原型对象了(也就是{x:2};)
console.log(NewBarInstance.x); //输出2
</script>
</body>
</html>
运行结果图如下:
这里的重点是,一旦开始创建实例,就不应用一个新对象来替换对象的原型。这样做将导致实例有一个指向不同原型的链接。