函数的原型属性

时间:2013-12-14 20:10:16

标签: javascript

我们有以下JS代码:

function doThis(){
    myKeys=[];
    var span= document.createElement("span");
    var parent=document.getElementById("parent");
    var child=document.getElementById("child");
    var submit=document.getElementById("submit");
    child.insertBefore(span,submit.nextSibling);
    Person.prototype={pr: "pr"};
    var p= new Person("Ivan", "Ivanov");
    myKeys.push(getAllKeyValuePair(Person));
    span.innerHTML=myKeys;
}
function getAllKeyValuePair(obj){
    var str="";
    for(var key in obj){
        try{
            str=str+"{"+key+", "+obj[key]+"}";
        }
        catch(e){
            console.log(key);
        }
    }
    return str;
}
function Person(name,surname){
    this.name=name;
    this.surname=surname;
}

JSFIDDLE 我们在

行声明prototype构造函数的Person属性
Person.prototype={pr: "pr"};

但是,当我尝试打印Person的所有属性时,我除外,我们至少有prototype属性指示{pr: "pr"}对象。但是如果我们替换行

myKeys.push(getAllKeyValuePair(Person));

myKeys.push(getAllKeyValuePair(Person.prototype));

我们可以看到{pr, "pr"}。 我不明白这一点,请解释一下为什么会发生这种情况?

1 个答案:

答案 0 :(得分:3)

getAllKeyValuePair(Person)询问Person构造函数的所有键。 实例可以使用Person.prototype属性构建者

var p= new Person("Ivan", "Ivanov");
myKeys.push(getAllKeyValuePair(p));

当您要求prototype的属性时,您没有看到Person的原因是prototype是不可枚举的属性。您可以通过以下方式看到:

> Object.getOwnPropertyDescriptor(Person, "prototype");
  > Object {
        value: Object,
        writeable: true,
        enumerable: false,
        configurable: false
    }

如果要枚举对象的所有属性,请使用Object.getOwnPropertyNames(Person)。请注意,这不会捕获从对象的原型链继承的属性(因此,我们说对象的“自己的”属性,而不是继承的属性)。