var Animal = function (){
} var property;
Animal.prototype.name='jason';
for( property in Animal.prototype ){
alert(property);
}为什么property只弹出了jason。
Animal.prototype 内置的constructor属性为什么弹不出来。用alert(Animal.prototype.constructor)
却可以看到。

解决方案 »

  1.   

    for in 枚举对象的属性不包括原型链当中的属性。可用对象的 hasOwnProperty()来测试对象是否具有某属性。propertyIsEnumerable()来测试此属性是否可被枚举。
      

  2.   

    简单可以这样理解,用prototype给原型(增加)产生的属性或函数都可以显示出来,不包括Animal的定义,如:
    var Animal = function (){
    }var property;
    Animal.prototype.name='jason';  //通过prototype产生属性
    Animal.prototype.fun01=function(){alert("function 01");}; ////通过prototype产生函数

    for( property in Animal.prototype ){
    alert(property);
    }可以显示jason,fun01,但不显示Animal的原型定义
      

  3.   

    不好意思楼上的 还是有点不明白for in 枚举对象的属性不包括原型链当中的属性。
    name为什么不算原型链当中的属性name已经被添加到了原型链之中啊
      

  4.   

    还有 除了constructor之外,还有没有不能被枚举的属性?
      

  5.   

    name是被添加到原型链了,所以不会被枚举出来呢。假如是这么写 window.onload = function () { var animal = new Object(); animal.name = '超人'; for (var p in animal) {
    alert(p + ' = ' + animal[p]);        // 这里只会枚举出name属性,而不含Object当中的属性。
    }
    }
      

  6.   


    貌似只要不是自己的都不会被for in枚举出来。
      

  7.   

    一楼的,
    虽然我也不知道为什么constructor不会被枚举出来,for in绝对是要看原型链的。
    hasOwnProperty不看原型链。不要误导别人。
      

  8.   

    嘿嘿,实验结果是这样
    var Animal = function (){
    }var property;
    Animal.prototype.name='jason'; //通过prototype产生属性
    Animal.prototype.fun01=function(){alert("function 01");}; ////通过prototype产生函数
    for( property in Animal.prototype ){
    alert(property);
    }显示name,fun01,但不显示Animal的原型定义
      

  9.   

    我的是MS IE 6.0 , FF 也是这样
      

  10.   


    (function(){
                    var Animal = function(){
                    };
                    Animal.prototype.inProtoType = {
                        name: "inPrototype"
                    };
                    
                    var aInstanceOfAnimal = new Animal();
                    aInstanceOfAnimal.notInPropertyType = {
                        name: "notInPropertyType"
                    };
                    for (name in aInstanceOfAnimal) {
                        document.write("name:"+name);
                        document.write("<br />");
                        if (aInstanceOfAnimal[name]) {
                            document.write("value:")
                            document.write(aInstanceOfAnimal[name]["name"]);
                            document.write("<br />")
                        }
                        if (aInstanceOfAnimal.hasOwnProperty(name)) {
                            document.write("can be get by hasOwnProperty");
                            document.write("<br />");
                        }
                        else {
                            document.write("can not be get by hasOwnProperty");
                            document.write("<br />");
                        }
                    }
                }())
    这段示例代码演示了属性在原型链的过程中, for in可以检索, 而hasOwnProperty不能检索出来。lz你这样做其实没有用到原型链, 因为你一直在操作prototype对象, 没有去操作Animal对象。所以不涉及任何原型链的问题。
    只是简单的赋值, 取值。
      

  11.   

    propertyIsEnumerable 属性说明
    如果 proName 存在于 object 中且可以使用一个 For…In 循环穷举出来,那么 propertyIsEnumerable 属性返回 true。如果 object 不具有所指定的属性或者所指定的属性不是可列举的,那么 propertyIsEnumerable 属性返回 false。典型地,预定义的属性不是可列举的,而用户定义的属性总是可列举的。
    js手册上的,这里可能解释了为什么constructor不能被枚举出来
      

  12.   

    var arr = new Array();
    for (var prop in arr) {
        alert(prop);
    }
    Array中属性也是预定义属性吧。
      

  13.   

    其实,他有一个特殊的说法,叫用户声明属性比如window对象,系统对象,用户自定义对象都属于这个范围。
    还有一类叫系统属性,比如prototype.constructor,这类属性不可以被delete关键字删除。