我们有以下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"}
。
我不明白这一点,请解释一下为什么会发生这种情况?
答案 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)
。请注意,这不会捕获从对象的原型链继承的属性(因此,我们说对象的“自己的”属性,而不是继承的属性)。