1.首先,我们先来了解一下js的getOwnProperty和in和Object.keys()以及getOwnPropertyNames
hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
Object.keys()
方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。
for...in
循环只会遍历可枚举属性,以及从其原型继承过来的属性
Object.getOwnPropertyNames()
方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
2.
var anotherObject = { a:2, }; Object.prototype.create = function(elem){ let o = function(){}; o.prototype = elem; return new o(); } var myObject = Object.create(anotherObject); console.log(anotherObject.a);//2 console.log(myObject.a);//2 console.log(anotherObject.hasOwnProperty("a"));//true console.log(myObject.hasOwnProperty("a"));//true
通过以上我们可以看出myObject虽然有a的值,但是没有a这个属性,它这个属性是anotherObject那里继承过来的。
3.但是我们如果执行以下的代码,结果就不一样了
myObject.a++;//隐式屏蔽 console.log(anotherObject.a);//2 console.log(myObject.a);//3 console.log(myObject.hasOwnProperty('a'));//true
这是因为myObject.a++就相当于myObject.a = myObject.a+1;所以myObject就有了a的属性,这个称为隐式屏蔽