zoukankan      html  css  js  c++  java
  • 对象(二)

    创建对象的方式:

    1、使用原生引用类型Object()  

    //使用引用Object创建  new Object()
        var obj1=new Object();
        obj1.name="obj1";
        obj1.num=1;

    2、对象字面量创建

     var obj2={
            name:"obj2",
            num:2
     };
    

    这两种方式的缺点: 当需要创建很多对象的时候,会产生大量的重复代码

    3、工厂模式    用函数来封装以特定接口创建对象

    function obj3(name,num){
            var b=new Object();       //显示的引用Object创建对象
            b.name=name;
            b.num=num;
            b.sayName=function(){
                alert(this.name);
            };   
            return b;                 //return 回一个对象
     }     
        var people=obj3("obj3",3);    //并未使用new   而是直接调用函数,返回一个对象
    

      可以无数次的调用obj3函数,每次都return 一个包含两个属性和一个方法的对象;

    缺点:无法解决对象识别问题;

    4、构造函数模式(创建自定义构造函数)

    //构造函数模式
        function Person(name,num){
            this.name=name;
            this.num=num;
            this.sayname=function(){
                alert(this.name);
            }
        }
        var person1=new Person("obj4",4);
    

      与工厂模式的不同:1、没有显示的创建对象;

                                           2、直接将属性和方法赋值给this;

                                           3、没有return 语句;

    实例person1保存着一个属性constructor==Person(等于构造函数),对象的constructor属性最初就是用来标识对象的;这正是构造函数模式胜过工厂模式的地方;
    缺点:每个方法都要在每个实例对象上重新创建一遍;

    5、原型模式:构造函数有一个prototype属性,指向原型对象,而这个原型对象包含由构造函数创建的实例共享的所有属性和方法;
    所有原型对象都有一个constructor属性,指向构造函数
    //原型模式
        function Person5(){};       //自定义构造函数 为空
        Person5.prototype={
    constructor:Person, name:"china", num:5, sayname:function(){ alert(this.name); } }; var obj5=new Person5();

     缺点:省略了为构造函数传参,结果所有实例在默认情况下都将获得相同的属性值,对于引用类型值得属性,只要有一个实例push到一个数组中值,那么其他实例也会获得这个新值,这就是为什么不单独使用原型模式的原因;

    6、构造函数和原型模式组合使用   构造函数模式用于定义实例属性;原型模式用于定义方法和共享属性;

    //构造函数和原型模式组合使用
        function Person6(name,num){
           // prototype:Person.prototype;
            this.name=name;
            this.num=num;
        }
        Person6.prototype={
            constructor:Person6,
            sayname:function(){
                alert(this.name);
            }
        }
        var obj6=new Person6("obj6",6);
    

      

    补充:

    1、检测对象类型:instanceof

         实例 instancsof  构造函数     //true

    2、检测实例的原型是否有某一对象

          只有实例的prototype属性指向的对象才返回true;     原型.isPrototypeOf(实例)

           Person6.prototype.isPrototypeOf(obj6)     //true

           Object.isPrototypeOf(obj6)     //false

    3、Object.getPrototypeOf()     识别原型

    alert(Object.getPrototypeOf(obj6)==Person6.prototype);    //true
    alert(Object.getPrototypeOf(obj6)==Object);               //false
    

      

    4、hasOwnProperty()  检测一个属性是否存在于实例中还是原型中   只有存在于对象实例才会返回true

      name必须用引号包起来,,否则为false;

    obj6.name=7;
    console.log(obj6.hasOwnProperty("name"));     //true  
    

      

    5、得到所有属性无论它是否  Object.getOwnPropertyNames()

         console.log(Object.getOwnPropertyNames(obj6));
         console.log(Object.getOwnPropertyNames(Person6.prototype));
    

      

         



  • 相关阅读:
    Fiddler-常用技巧
    Fiddler-工作原理
    C语言-EOF和feof()判断文件结尾的区别
    C语言-一个fopen函数中未使用二进制模式(b)引发的血案
    VIM-不常用或不知道的技巧
    C语言-srand种子详解
    C语言-字符串操作函数
    C语言-Makefile经典教程(掌握这些足够)
    分布拟合——正态/拉普拉斯/对数高斯/瑞利 分布
    曲线拟合——(2)拉普拉斯/瑞利/对数正态 曲线
  • 原文地址:https://www.cnblogs.com/yongyang/p/8909012.html
Copyright © 2011-2022 走看看