对象本无名-关于引用
2011-10-21 16:35
316 查看
介绍:这是篇简单的文章,其实就是引用的问题,但是挺绕的。
问题:
var f=function(){this.a=1}
f.prototype.b=33
var a1=new f()
f.prototype = {
b:3
}
console.log(a1.b) //?
分析:
这里结果是33还是3呢。初看上去是3,好像3覆盖了原来的33.
如果分析一下对象生成的过程。f本身是一个对象A,new f 时。出一个新的对象C。
这个对象有一个__proto__属性链接到f.prototye对象B。现在C已经指向了B。
而后,f.prototype也就是B 又指向了D对象{b:3}。
所以这里一共就A,B,C,D三个对象。看下图
![](http://images.cnblogs.com/cnblogs_com/lunalord/288736/r_%e5%af%b9%e8%b1%a1%e6%97%a0%e5%90%8d.jpg)
总结:
现在f.prototype本来是指向B对象的,现在又指向了D对象。
所以不要把f.prototype当作对象,他是指向了对象。
对象本身是没有名字。new的对象本身都是系统自带的,相同的一个。new的过程只是链接而已。
只是给加了各种属性,各种引用。
基本类型的值在内存中有固定的大小,所以保存在栈中。复制基本类型值时,会创建一个副本。
引用类型的值是对象,保存在堆中。复制引用类型值时,复制的是该对象的指针。因此两个变量指向的都是一个对象
扩展
结果a1.b=33.
如果要得到3的话,可以通过constructor引用到原函数,然后输出现在的b就行了。a1.__proto__.constructor.prototype.b =3
这里A.prototype本来引用了B对象,现在又改成引用了D对象。B对象如果没有C对象的引用,就会被垃圾收集器自动清除掉。
小题目
下面是权威指南上引用一节的题目,也是这个意思。
var a = [1,2,3];
var b = a;
a[0] = 99;
alert(b);
不要把a当作[1,2,3]来看,看成a指向了数组[1,2,3]
b=a。b也指向了数组[1,2,3]
这样,就清楚了
题目2
这里aa.prototype.b===b.__proto__.b?
结果发现aa.prototyop!==b.__proto__ 这是为什么呢?
因为b.__proto__指向的对象是 原来的 aa.prototype。所以我们在看构造函数时,不能只看到函数本身,其实还有隐式的prototype属性
问题:
var f=function(){this.a=1}
f.prototype.b=33
var a1=new f()
f.prototype = {
b:3
}
console.log(a1.b) //?
分析:
这里结果是33还是3呢。初看上去是3,好像3覆盖了原来的33.
如果分析一下对象生成的过程。f本身是一个对象A,new f 时。出一个新的对象C。
这个对象有一个__proto__属性链接到f.prototye对象B。现在C已经指向了B。
而后,f.prototype也就是B 又指向了D对象{b:3}。
所以这里一共就A,B,C,D三个对象。看下图
![](http://images.cnblogs.com/cnblogs_com/lunalord/288736/r_%e5%af%b9%e8%b1%a1%e6%97%a0%e5%90%8d.jpg)
总结:
现在f.prototype本来是指向B对象的,现在又指向了D对象。
所以不要把f.prototype当作对象,他是指向了对象。
对象本身是没有名字。new的对象本身都是系统自带的,相同的一个。new的过程只是链接而已。
只是给加了各种属性,各种引用。
基本类型的值在内存中有固定的大小,所以保存在栈中。复制基本类型值时,会创建一个副本。
引用类型的值是对象,保存在堆中。复制引用类型值时,复制的是该对象的指针。因此两个变量指向的都是一个对象
扩展
结果a1.b=33.
如果要得到3的话,可以通过constructor引用到原函数,然后输出现在的b就行了。a1.__proto__.constructor.prototype.b =3
这里A.prototype本来引用了B对象,现在又改成引用了D对象。B对象如果没有C对象的引用,就会被垃圾收集器自动清除掉。
小题目
下面是权威指南上引用一节的题目,也是这个意思。
var a = [1,2,3];
var b = a;
a[0] = 99;
alert(b);
不要把a当作[1,2,3]来看,看成a指向了数组[1,2,3]
b=a。b也指向了数组[1,2,3]
这样,就清楚了
题目2
这里aa.prototype.b===b.__proto__.b?
function aa(){ this.a=2; aa = function(){ this.a=3; } aa.prototype.b=function(x){alert(x)}; } var b=new aa(); alert(aa.prototype.b===b.__proto__.b); console.log(aa.prototype,b.__proto__);
结果发现aa.prototyop!==b.__proto__ 这是为什么呢?
因为b.__proto__指向的对象是 原来的 aa.prototype。所以我们在看构造函数时,不能只看到函数本身,其实还有隐式的prototype属性
相关文章推荐
- 由无名对象(临时对象)引发的关于“引用”的思考
- 转:由无名对象(临时对象)引发的关于“引用”的思考
- 关于未将对象引用设置到对象实例简单原理分析,与解决方法
- 关于Java对象与对象引用
- Objective-C关于非ARC模式下的对象引用计数
- 关于父类引用指向子类对象在javaee中的理解(初学)
- 关于解决JavaScript中使用require引用外部js时出现的某个对象 not defined 时现时消失 问题
- 关于父类引用指向子类对象
- 关于父类引用指向子类对象
- 关于理解Java中的多态性,父类引用创建子类对象
- 关于js对象引用的小例子
- 关于临时对象的引用
- 关于对象引用
- 关于与单例与采用静态变量引用一个对象的区别
- Java关于接口引用实现该接口类的对象
- 关于C++对象引用的这种用法
- 关于DropDownList未将对象引用设置到对象的实例
- 关于类对象的引用计数值增加的情况
- 关于Java对象引用的理解
- 关于父类引用指向子类对象(A a = New B();)的使用,理解向上转型