为何删除Object.create创建对象的属性不生效?
为什么删除Emp1的company属性后它仍然存在?
这是因为你没搞懂Object.create的工作机制和delete操作符的作用范围:
Object.create(Employee)的本质
用这个方法创建的Emp1对象,自身并没有company属性——这个属性是存在于它的原型对象(也就是你定义的Employee)上的。Emp1只是通过原型链继承了这个属性的访问权。delete操作符的作用限制delete只能删除对象自身拥有的属性。当你执行delete Emp1.company时,JS发现Emp1自己根本没有这个属性,所以这个删除操作不会产生任何效果。
之后你访问Emp1.company时,JS会顺着原型链向上查找,最终找到原型上的Employee.company,所以控制台依然会输出xyz。
你可以用hasOwnProperty方法验证这一点:
console.log(Emp1.hasOwnProperty('company')); // 输出 false,证明该属性不是Emp1自身的
如果想让Emp1访问不到company,可以参考这两种思路:
- 直接修改原型上的属性(但会影响所有继承自
Employee的对象):delete Employee.company; console.log(Emp1.company); // 输出 undefined - 给
Emp1自身添加company属性覆盖原型值,后续也可删除这个自身属性:Emp1.company = undefined; // 给Emp1添加自身属性,屏蔽原型链查找 console.log(Emp1.company); // 输出 undefined
内容的提问来源于stack exchange,提问作者Vipul Prakash
相关产品推荐
相关产品推荐

