• 检测或遍历属性在实例中还是在构造函数的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"]
  • 相关阅读:
    Vim
    一文搞定Samba云服务器配置(阿里云)CentOS8.3
    第四课 婴儿是如何思考的 思维的发展历程
    C++/VS基础篇
    Windows下Qt VS 打包程序 到他人电脑安装运行出现的问题
    第三课 斯金纳
    第二课基础 弗洛伊德
    C++中头文件和实现文件的关系
    字符串 数字 转换
    Ucore lab1实验报告
  • 原文地址:https://www.cnblogs.com/jcbo/p/6757071.html
Copyright © 2020-2023  润新知