js的隐式屏蔽

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的属性,这个称为隐式屏蔽

posted @ 2020-09-12 10:07  放学别跑啊  阅读(185)  评论(0编辑  收藏  举报