zoukankan      html  css  js  c++  java
  • js:对象的创建(为prototype做铺垫)

    /**
     *在js中并不存在类,所以能够直接通过Object来创建对象,可是使用这样的方式创建有一
     *弊端:因为没有类的约束,无法实现对象的反复利用,而且没有一种规范约定,在操作时easy带来问题。
     */
    var person = new Object();
    person.name = "octopus";
    person.age = 25;
    person.say = function(){
      alert(this.name+","+this.age);
    }

    json:json就是js的对象,可是它省去了XML标签,而是通过{}来完毕对象的说明。
    var person = {
      name:"张三",
      age:25,
      say:function(){
        alert(this.name+","+this.age);
      }
    }

    //通过json依旧能够创建对象数组,创建方式和js的数组一样。
    var ps = [
      {name:"张三",age:25},
      {name:"李四",age:26}
    ];
    for(var i=0;i<ps.length;i++){
      alert(ps[i].name);
    }
    /**
     * 创建一组用户,用户的属性有:
     * name:String,age:int,friends:Array
     * List<Person> ps = new ArrayList<Person>();
     * ps.add(new Person("张三",25,["Ada","Alice"]));
     * ps.add(new Person("李四",26,["Ada","Chris"]));
     * 把ps转换为json
     */
    ps = [
      {
        name:"张三",
        age:25,
        friends:["Ada","Alice"]
      },
      {
        name:"李四",
        age:26,
        friends:["Ada","Chris"]
      }
    ];

    //通过工厂的方式来创建对象
    function createPerson(name,age){
      var o = new Object();
      o.name = this.name;
      o.age = this.age;
      o.say = function(){
        alert(this.name+":"+this.age);
      }
      return o;
    }
    //使用工厂的方式,尽管有效地攻克了类的问题,可是也存在还有一个问题:
    //我们无法检測对象p1和p2的详细数据类型,用typeof p1/p2 得到的仅仅能是Object。
    var p1 = createPerson("Ada",21); 
    var p2 = createPerson("Leon",23);
    p1.say();   //Ada:21
    p2.say();   //Leon:23

    /**
     * 通过构造函数的方式创建,和基于工厂的创建方式类似,
     * 最大的差别就是函数的名称就是类的名称,依照Java约定,第一个字母大写,
     * 使用构造函数创建时,在函数内部是通过thiskeyword来完毕属性的定义。
     */
    function Person(name,age){
      this.name = name;
      this.age = age;
      //这样的方式带来的问题是全部的Person对象都会为该行为分配空间
      this.say = function(){
        alert(this.name+","+this.age);
      }
    }
    //通过Person来创建对象
    var p = new Person("octopus",24);
    p.say();  //octopus,24
    /**
     * 使用构造函数的方式能够通过一下方式来检測对象的类型
     */
    alert(p1 instanceof Person);  //true
    alert(p1.say==p2.say);    //false
    /**可是上述构造函数也会带来一些问题:
     * 1.每个对象中都会存在一个方法的拷贝,假设对象的行为非常对的话,空间的占有率就会大大添加
     * 解决方法:能够将函数放到全局变量中定义,这样能够让类中的行为指向同一个函数。
     */
    function Person(name,age){
      this.name = name;
      this.age = age;
      //这样的方式带来的问题是全部的Person对象都会为该行为分配空间
      this.say = say;
    }

    //将行为设置为全局的
    function(){
      alert(this.name+","+this.age);
    }
    alert(p1.say==p2.say);  //true
    //可是假设将行为设置为全局函数的时候,这个函数就能够被window调用,此时就破坏了对象的封装性。
    //并且假设非常多类用全局的方式定义了大量的方法,easy造成混乱,也将不利于开发。

    下节我们学习用原型的方式创建对象。

    原创文章如转载,请注明出处,本文首发于csdn站点:http://blog.csdn.net/magneto7/article/details/24906045

  • 相关阅读:
    Java 跨系统开发隐患(一)
    SpringBoot邮件推送功能
    基于图灵api的Python机器人
    JSP编码问题解决方法
    记一次数据结构课设
    基于百度语音识别API的Python语音识别小程序
    帝国cms过滤采集内容
    如何批量取消文章审核
    评论时判断会员是否登录
    帝国cms把文章加入到收藏夹代码
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/3998784.html
Copyright © 2011-2022 走看看