js中原型的重新赋值后的变化
以前总是认为,在构造函数的原型发生改变的时候,所有的构造实例,无论是新的还是已经创建过的,其跟原型相关的属性值都会发生改变,今天发现不是这样的……
function CreateUser(){ } CreateUser.prototype.name = "one"; var user1 = new CreateUser(); CreateUser.prototype = { name:"two", age:22, active:function(){ return CreateUser.prototype.name; } } var user2 = new CreateUser(); alert(user1.name);//one alert(user2.name);//two alert(user1.active());//Uncaught TypeError: undefined is not a function
我们看一下上边的弹出结果,第一个是one,第二个是two,而第三个是Uncaught TypeError: undefined is not a function
也就是说新定义的原型对象并没有将原始的原型对象覆盖,原始的原型对象依旧在内存当中。
然后,重新理了一下思路,觉得正确的理解应该是这样的,
一:新创建一个构造函数的时候,该构造函数有一个prototype属性指向该函数的原型对象,然后每一个构造实例也都有一个指针(内部属性)指向该构造函数的原型对象,也就是构造函数中的prototype中存储的引用地址跟构造实例中的指针存储的引用地址是相同的。
二:上述例子中的CreateUser.prototype的重新赋值,是将CreateUser.prototype总保存的引用地址更改为新创建对象的地址,这个并不能表明原始的原型对象的覆盖,原始的原型对象依旧保存在内存当中;也就能够说明user1.name为什么还是one了,因为其包含的引用地址依旧是原始构造函数的,且指向对象并未覆盖。
三:新创将的构造函数实例中的指针包含的引用地址是跟CreateUser.prototype中的引用地址相同的,所以也就能够说明为什么user2.name是two,因为在创建user2对象的时候
CreateUser.prototype中的引用地址已经发生改变;
下边出一个小测试,跟上边的原理是一样的,如果你理解了,说明上边的你也理解了:
var arr = [1,2,3,4,5]; var arr1 = arr; arr = [6,7,8,9,10]; alert(arr1[0]);//1
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。