检测或遍历属性在实例中还是在构造函数的prototype属性对象中

1.hasOwnProperty()方法:可以检测一个属性是否存在于实例中还是原型对象中

 function Person(){};
 Person.prototype.name="Nicholas";
 Person.prototype.age=29;
 Person.prototype.job="Software Engineer";
 Person.prototype.sayName=function(){
     alert(this.name);
 }
var person1=new Person();
var Person2=new Person();
alert(person1.hasOwnProperty("name"));     //false
person1.name="Grey";
alert(person1.hasOwnProperty("name"));     //true
delete person1.name       //删除属性
alert(person1.hasOwnProperty("name"));     //false

2.  in操作符

 function Person(){};
 Person.prototype.name="Nicholas";
 Person.prototype.age=29;
 Person.prototype.job="Software Engineer";
 Person.prototype.sayName=function(){
     alert(this.name);
 }
var person1=new Person();
var Person2=new Person();  
alert(person1.hasOwnProperty("name"));     //false
alert("name" in person1);            //true
person1.name="Grey";
alert(person1.hasOwnProperty("name"));     //true
alert("name" in person1);            //true
delete person1.name       //删除属性
alert(person1.hasOwnProperty("name"));     //false
alert("name" in person1);            //true

name属性如论是在对象上还是在原型上,调用in操作符 都返回true

因此,同时使用hasOwnProperty()方法和in操作符,就可以确定该属性到底是存在于实例对象中还是存在原型对象上。

3.hasPrototypeProperty()

 function Person(){};
 Person.prototype.name="Nicholas";
 Person.prototype.age=29;
 Person.prototype.job="Software Engineer";
 Person.prototype.sayName=function(){
     alert(this.name);
 }
var person=new Person();
alert(hasPrototypeProperty(person,"name"));     //true
person1.name="Grey";
alert(hasPrototypeProperty(person,"name"));   //false

上例中,name属性先是存在于原型中,因此hasPrototypeProperty()返回true;当在实例中重写name属性,即使在原型中仍然有name属性,hasPrototypeProperty()仍然返回false.

4. for-in循环:返回所有能够通过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性

  Person.prototype.name="Nicholas";
    Person.prototype.age=29;
    Person.prototype.job="Software Engineer";
    Person.prototype.sayName=function(){
        alert(this.name);
    }
    var person=new Person();
    person.x=1;
    person.y=2;
    person.z=3;
    for(var prop in person){
        console.log(prop+": "+person[prop]);
    }

5. Object.keys(obj)与Object.getOwnPropertyNames(obj)

Object.keys(obj)方法接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组。

Object.getOwnPropertyNames(obj)方法返回所有的属性无论是否可枚举

 function Person(){}
    Person.prototype.name="Nicholas";
    Person.prototype.age=29;
    Person.prototype.job="Software Engineer";
    Person.prototype.sayName=function(){
        alert(this.name);
    }
    var person=new Person();
    person.x=1;
    person.y=2;
    person.z=3;
    var keys1=Object.keys(person);
    var keys2=Object.keys(Person.prototype);
    var keys3=Object.getOwnPropertyNames(person);
    var keys4=Object.getOwnPropertyNames(Person.prototype);
    console.log(keys1);    //["x","y","z"]
    console.log(keys2);    //["name","age","job","sayName"]
    console.log(keys3);    //["x","y","z"]
    console.log(keys4);    //["constructor","name","age","job","sayName"]
原文地址:https://www.cnblogs.com/jcbo/p/6757071.html