我看别人的帖子说:
js访问对象成员时(以a成员为例),过程是:
1.在对象自身寻找成员a,若有,则访问该成员
2.若对象自身没有a成员,在其构造函数原型链即prototype成员上寻找a成员,若有,则访问该成员
3.若构造函数原型链上仍然没有该成员,则该成员为undefined是这样吗?我的理解是在对象自身寻找成员a,若有,则访问该成员,没有就undefined,和构造函数的prototype没有关系了
比如说:function f1(){};
f1.prototype.x=10;
var obj=new f1();
f1.prototype.y=200;
for(m in obj){
alert(m);
}在obj已经实例出的情况下,我增加了一个原形属性y,然后遍历obj, 可以显示出y属性,说明f1.prototype.y=200这条语句一执行,obj对象已经有了y属性,所以不会有“2.若对象自身没有a成员,在其构造函数原型链即prototype成员上寻找a成员,若有,则访问该成员” 这种情况发生。
js访问对象成员时(以a成员为例),过程是:
1.在对象自身寻找成员a,若有,则访问该成员
2.若对象自身没有a成员,在其构造函数原型链即prototype成员上寻找a成员,若有,则访问该成员
3.若构造函数原型链上仍然没有该成员,则该成员为undefined是这样吗?我的理解是在对象自身寻找成员a,若有,则访问该成员,没有就undefined,和构造函数的prototype没有关系了
比如说:function f1(){};
f1.prototype.x=10;
var obj=new f1();
f1.prototype.y=200;
for(m in obj){
alert(m);
}在obj已经实例出的情况下,我增加了一个原形属性y,然后遍历obj, 可以显示出y属性,说明f1.prototype.y=200这条语句一执行,obj对象已经有了y属性,所以不会有“2.若对象自身没有a成员,在其构造函数原型链即prototype成员上寻找a成员,若有,则访问该成员” 这种情况发生。
解决方案 »
- 插入HTML元素不成功来人解决下
- 跨域获取静态html
- 请教高手一个option选项的问题
- 超链接添加 文件域(附件)
- chrome pdf viewer 中能否使用JS关闭预览直接打印?
- 怎么判断点击事件的对象属于父对象第几个子节点
- 如何将文本转成html效果
- jquery 合并列的时候根据前一列合并 后一列的单元格合并范围不能超过前一列的合并范围 如果某一列没有合并的 后面的所有列都不合并 高手帮忙啊
- 简单问题,送分。
- 请问ueditor批量上传图片,图片模糊了,怎么上传原图不处理啊
- jqGrid 的 getRowData 执行取到的都是grid中的第一条记录
- 本地数据库经纬度 调用百度地图API 在百度地图上显示 用什么方案实现的问题。。
f1.prototype.y=200;是在原型上增加一个y属性,当然可以遍历到了
我的意思是说,当f1.prototype.y=200执行这条语句时,js引擎直接往obj添加了y属性,不需要上面第二步那个查找过程。
this.y = 1;
};
f1.y = 20;
f1.prototype.x = 10;
f1.prototype.y = 100;
var obj = new f1();
f1.prototype.y = 200;
for(m in obj) {
console.log('成员 ' + m);
console.log('成员 ' + m + ' 的值是: ' + obj[m]);
console.log('成员 ' + obj['z']);
}
function f1() {
this.y = 1;
};
f1.y = 20;
f1.prototype.x = 10;
f1.prototype.y = 100;
var obj = new f1();
f1.prototype.y = 200;
for(m in obj) {
alert('成员 ' + m);
alert ('成员 ' + m + ' 的值是: ' + obj[m]);
alert ('成员 ' + obj['z']);
}这个例子在obj被实例出来后,加了f1.prototype.y = 200; 我觉得js引擎是可以通过hasOwnProperty()检查y的属性来源,知道y不是原形继承的属性,所以不会覆盖obj.y, obj.y还是等于1。
可这个例子还是证明不了“若对象自身没有a成员,在其构造函数原型链即prototype成员上寻找a成员,若有,则访问该成员 ”。
function f1(){
this.y = 1;
}
f1.prototype.y = 2;
var obj = new f1();
console.log(obj.y);//输出1
delete obj.y;//删除obj的y属性
console.log(obj.y);//输出2