深入理解JavaScript中创建对象模式的演变(原型)(6)

  有了in操作符以及hasOwnProperty()方法我们就可以判断一个属性是否存在于原型对象了(而不是存在于对象实例或者是根本就不存在)。编写hasPrototypeProperty()函数并检验:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

 

                function Person(){}

    <strong>    function hasPrototypeProperty(Object,name){

            return !Object.hasOwnProperty(name)&&(name in Object);

                }</strong>

        Person.prototype.name="zzw";

        Person.prototype.age=21;

        Person.prototype.school="xjtu";

        Person.prototype.sayName=function(){

            console.log(this.name);

        };

        var person1=new Person();

        var person2=new Person();

        console.log(person1.name);//zzw

        <strong>console.log(hasPrototypeProperty(person1,"name"));//true</strong>

        person1.name="htt";

        console.log(person1.name);//htt

<strong>        console.log(hasPrototypeProperty(person1,"name"));//true</strong>

            delete person1.name;

                console.log(person1.name);//zzw

    <strong>    console.log(hasPrototypeProperty(person1,"name"));//true

</strong>

 

  其中hasPrototypeProperty()函数的判断方式是:in操作符返回true而hasOwnProperty()方法返回false,那么如果最终得到true则说明属性一定存在于原型对象中。(注意:逻辑非运算符!的优先级要远远高于逻辑与&&运算符的优先级

D.for-in循环和Object.keys()方法在原型中的使用

  在通过for-in循环时,它返回的是所有能够通过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性。且对于屏蔽了原型中不可枚举的属性(即将[[Enumerable]]标记为false的属性)也会在for-in中循环中返回。(注:IE早期版本中存在一个bug,即屏蔽不可枚举属性的实例属性不会出现在for-in循环中,这里不做详细介绍)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 

function Person(){}<br>          Person.prototype.name="zzw";

Person.prototype.age=21;

Person.prototype.school="xjtu";

Person.prototype.sayName=function(){

    console.log(this.name);

};

var person1=new Person();

var person2=new Person();

console.log(person1.name);//zzw

person1.name="htt";

console.log(person1.name);//htt

    delete person1.name;

        console.log(person1.name);//zzw

for(var propName in person1){

    console.log(propName);//name age school sayName

}

 

  通过for-in循环,我们可以枚举初name age school sayName这几个属性。由于person1中的[[prototype]]属性不可被访问,因此,我们不能利用for-in循环枚举出它。

  Object.keys()方法接收一个参数,这个参数可以是原型对象,也可以是由构造函数创建的实例对象,返回一个包含所有可枚举属性的字符串数组。如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 

            function Person(){}

        Person.prototype.name="zzw";

        Person.prototype.age=21;

        Person.prototype.school="xjtu";

        Person.prototype.sayName=function(){

            console.log(this.name);

        };

        var person1=new Person();

        var person2=new Person();

        console.log(person1.name);//zzw

        person1.name="htt";

        console.log(person1.name);//htt

        person1.age="18";

    <strong>    console.log(Object.keys(Person.prototype));//["name", "age", "school", "sayName"]

        console.log(Object.keys(person1));//["name", "age"]

        console.log(Object.keys(person2));//[]

</strong>

 

  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2053e2e6b354a6d70a92c87859b7c2a9.html