属性列举与原型的关係
自订原型 与 原生原型 最大的不同是在可列举(enumerable)的部分
原生原型enumberable : false;
自订原型enumberable : true;
这里举一个例子
function person(){}person.prototype.name = '小明';var alex = new person();alex.a = undefined;console.log(alex);
会发现 person 原型的 name属性颜色
与物件原型的属性颜色不一样
但它跟我们一般定义属性的颜色是一样的
那为什么都是原型属性 为什么颜色会不一样呢??
我们继续往下看
// 利用for in 来查看for(var key in alex){ console.log(key); // a name}// 会发现原型的 name 出现,但为什么原型其他属性不会被列举呢??
因为这时候的 name 的 enumerable 为true
我们利用 getOwnPropertyDescriptor 来证明
function person(){}person.prototype.name = '小明';var alex = new person();alex.a = undefined;for(var key in alex){ console.log(key); // a name}console.log(Object.getOwnPropertyDescriptor(alex,'a')); // enumerable: trueconsole.log(Object.getOwnPropertyDescriptor(alex.__proto__,'name')); // enumerable: trueconsole.log(Object.getOwnPropertyDescriptor(alex.__proto__.__proto__,'toString')); // enumerable: false
所以假如我们把 name 的 enumerable改为false
function person(){}person.prototype.name = '小明';Object.defineProperty(person.prototype,'name',{ enumerable: false,})var alex = new person();alex.a = undefined;console.log(alex);for(var key in alex){ console.log(key); // a}console.log(Object.getOwnPropertyDescriptor(alex,'a')); // enumerable: trueconsole.log(Object.getOwnPropertyDescriptor(alex.__proto__,'name')); // enumerable: falseconsole.log(Object.getOwnPropertyDescriptor(alex.__proto__.__proto__,'toString')); // enumerable: false
这样列举的东西 只有 a而已
name 无法被列举
那今天的介绍就到这里
若有任何问题 或 内容有误
都可以跟我说唷