我看别人的帖子说:
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成员,若有,则访问该成员” 这种情况发生。 

解决方案 »

  1.   

    不是很明白你的意思
    f1.prototype.y=200;是在原型上增加一个y属性,当然可以遍历到了
      

  2.   

    2.若对象自身没有a成员,在其构造函数原型链即prototype成员上寻找a成员,若有,则访问该成员
      

  3.   


    我的意思是说,当f1.prototype.y=200执行这条语句时,js引擎直接往obj添加了y属性,不需要上面第二步那个查找过程。
      

  4.   

    以下代码在丰富一下,验证: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) {
        console.log('成员 ' + m);
        console.log('成员 ' + m + ' 的值是: ' + obj[m]);
        console.log('成员 ' + obj['z']);
    }
      

  5.   


    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成员,若有,则访问该成员 ”。
      

  6.   

    下面这个例子就可以理解了没有的时候去原型链找
    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