zoukankan      html  css  js  c++  java
  • javascript-面向对象和原型(1).

    1.工厂模式解决了集中实例化的问题,解决了实例化大量重复的问题

     1 function createObject(name ,age)
     2   {
     3       var obj =new Object();                                //创建对象
     4       obj.name =name;                                        //添加属性
     5       obj.age=age;        
     6       obj.run =function()                                    //添加方法
     7       {                            
     8           return this.name +this.age+'运行中...';
     9       }
    10         return obj;                                            //返回对象引用
    11   }
    12   
    13         var box1 = createObject('Lee',100);                    //创建第一个对象
    14         var box2 = createObject('Jack',200);                //创建第二个对象
    15 
    16         alert(box1.run());                                    //打印第一个实例run()方法    
    17         alert(box2.run());                                    //打印第二个实例run()方法
    18 
    19         //问题:无法识别问题,因为根本无法搞清楚他们到底是哪个对象的实例
    20         alert(typeof box1);                                    //object    
    21         alert(typeof box1);                                    //object
    22         //instanceof判断一个变量是否是某个对象的实例 (条件是已知构造函数的名称)
    23         alert(box1 instanceof Object);                        //true
    24         alert(box2 instanceof Object);                        //true

    2.构造方法&构造函数 [解决工厂模式不知道引用了哪个对象的实例]

     1   //构造函数名 首字母大写 
     2   function Box(name ,age)
     3   {
     4       //构造函数没有new Object,但它后台会自动 var obj =new Object;
     5       //this 是指的实例化的 对象
     6       this.name = name;
     7       this.age = age;
     8       this.run =function()
     9       {
    10           return this.name +this.age+'运行中...';
    11       }
    12       //构造函数不需要返回对象引用,它是后台自动返回的,没有return;
    13   }
    14     var box1 = new Box('Lee',100);        //实例化
    15     var box2 = new Box('jack',200);        //实例化
    16     
    17     alert(box1.run == box2.run);          //false 因为他们的引用地址 不一样,我们用prototype解决 这个问题
    18     
    19     alert(box1 instanceof Object);  
    20     alert(box1 instanceof Box); 
    21     
    22     var o =new Object();
    23     //对象冒充
    24     Box.call(o,'CSN',500);
    25     alert(o.run());

    3.prototype原型[解决方法引用地址不一致]

     1  function Box(){};
     2  3      Box.prototype.name='Lee';
     4      Box.prototype.age=100;
     5      Box.prototype.run =function()
     6      {
     7          return this.name + this.age + '运行中...';
     8      }
     9 10     var box1 =new Box();
    11     var box2 =new Box();
    12 
    13     alert(box1.run == box2.run);                        //true 方法写在原型上 引用地址共享
    14     
    15     alert(box1._proto_);                                //IE不支持 这个属性是一个指针指向prototype原型对象
    16     //★constructor
    17     alert(box1.constructor);                            //构造属性,可以获取构造函数本身
    18                                                         //作用是被原型指针定位,然后得到构造函数本身
    19                                                         //其实就是对象实例 对应的 原型对象的作用
    20                                     
    21     //★判断一个对象实例 是否指向了该构造函数 的原型对象,可以使用isPrototypeOf()方法来测试
    22     alert(Box.prototype.isPrototypeOf(box1));             //只要实例化对象,自动指向
    23     alert(Object.prototype.isPrototypeOf(box1));  

    注:构造函数在创建实例的时候,实例会自动生成一个_proto_指针,指向原型对象[prototype]里的constructor [原型属性]

     

    ★原型模式的执行流程

     1 function Box(){};                             //构造函数体内什么都没有,这里如果有,叫做实例属性,实例方法                            
     2         Box.prototype.name='lee';
     3         Box.prototype.age=100;
     4         Box.prototype.run=function()
     5         {
     6                 return this.name + this.age+'运行中...';
     7         };
     8         
     9         var box1 = new Box();
    10         box1.name='Jack';                        //实例属性并没有重写原型属性
    11         alert(box1.name);                        //=> Jack 就近原则,优先 寻找实例里面的属性,如果没有就查找原型里面的属性
    12         
    13         //★判断 实例 中是否存在指定属性 可以使用hasOwnProperty()
    14         alert(box1.hasOwnProperty('name'));      
    15         
    16         //★in 操作符 不管实例属性 或者 原型属性 只要有就返货true两边都没有返回false
    17         alert('name' in box1);
    18         
    19         //如果我想访问了实例的属性,然后有访问原型的属性
    20         
    21         delete box1.name;                        //删除实例中的属性
    22         alert(box1.name);                 //=> lee
    23         delete Box.prototype.name;                //删除原型中的属性
    24         alert(box1.name);                //=> undefined

    1 //判断只有原型中有属性
    2 function isProperty(object , property)
    3 {
    4     return !object.hasOwnProperty(property)&&(property in object);
    5 }
  • 相关阅读:
    基于Docker搭建分布式消息队列Kafka
    [转]JAVA 开发环境设置(简单易懂)
    微信分享地址参数记录(出于防止微信刷票而产生的学习记录)
    万网开启二级站点【原创】
    PHP
    [转]什么是RSS
    html页面缓存(浏览器)
    [从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)【转】
    Jquery中$.get(),$.post(),$.ajax(),$.getJSON(),$.getScript(),$.load()的用法总结【转】
    JQuery中$.load()方法的用法和分析【转】
  • 原文地址:https://www.cnblogs.com/VanqusherCsn/p/4255322.html
Copyright © 2011-2022 走看看