`
yahaitt
  • 浏览: 756970 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

js面向对象

阅读更多
记录自浪曦风中叶老师的JavaScript课堂

1、js区别于java的特性还有:实例化类对象时,如果不传递参数,则可以省略括号,如:
  var object = new Object;
  var string = new String;
  var date = new Date;

  当然也可以写成带括号的,如:
  var object = new Object();
 
  建议带括号,以符合java模式

  以上Object、String、Date等都是内置类,即本地类

2、数组的两种呈现方式:数组类Array及[]
  var array = new Array();//array为数组类实例对象,也就是数组
  array.push(1);
  array.push(2);
  array.push(3);

  alert(array.length);//结果:3 数组类Array有length属性

  var array = [];
  array.push(1);
  array.push(2);
  array.push(3);

  var array = [1,2,3];

  以上3种情况结果都一样,第3种用的最常见

3、早绑定和晚绑定:js都是晚绑定,java都是早绑定

4、js中类的定义方式:
  A、工厂方式定义类
  第一种方式:
  function createObject(username,password){
    var object = new Object();
    object.username = username;
    object.password = password;
    //多个对象就会有多个匿名对象(也就是匿名方法)产生
    object.get = function(){
      //此时,this指向的是当前对象,即object
      alert("username: " + this.username + "\npassword:" + this.password);
    };
    return object;
  }
  var o1 = createObject("zhangsan","123456");
  o1.get();

  第二种方式:
  function get(){
    //此时,this指向的是调用get方法的对象
    alert("username: " + this.username + "\npassword:" + this.password);
  }

  function createObject(username,password){
    var object = new Object();
    object.username = username;
    object.password = password;
    //不管有几个对象产生,get方法(对象)只产生一个
    object.get = get;
    return object;
  }
  var o1 = createObject("zhangsan","123456");
  o1.get();

  B、构造函数方式定义类
  第一种方式:
  function Person(username,password){
    //new Person时会产生一个对象,this就会指向这个对象,并且会将这个对象返回,因此当new Person时能得到对象
    this.name = username;
    this.password = password;
    this.get = function(){
      //多个Person对象就会有多个匿名对象(也就是匿名方法)产生
      alert("username: " + this.username + "\npassword:" + this.password);
    };
  }
  var o1 = new Person("zhangsan","123456");
  o1.get();

  第二种方式:
  function get(){
    //此时,this指向调用get方法的对象
    alert("username: " + this.username + "\npassword:" + this.password);
  }

  function Person(username,password){
    //new Person时会产生一个对象,this就会指向这个对象,并且会将这个对象返回,因此当new Person时能得到对象
    this.name = username;
    this.password = password;
    //不管有几个对象产生,get方法(对象)只产生一个
    this.get = get;
  }
  var o1 = new Person("zhangsan","123456");
  o1.get();

  C、原型方式创建类:prototype,prototype是每个类或每个对象都具有的属性,可以通过对prototype来实现对类或对象的属性或方法的追加
  特点:不管产生多少个实例对象,其追加的方法只产生一次
  function Person(){
  }
  Person.prototype.username = "zhangsan";//Person.prototype.username = new Array();
  Person.prototype.password = "123";
  Person.prototype.get = function(){
    alert("username: " + this.username + "\npassword: " + this.password);
  }
  var person = new Person();
  var person2 = new Person();
  //person.username.push("zhangsan");
  person.get();
  person2.get();

  弊端1:不能通过在new的时候给予不同的初始化值
  弊端2:如果prototype中的一个属性的值是一个对象,而不是一个字符串,比如数组,那么当一个实例对象对这个数组进行了操作后,其他的实例对象也会受到影响,因为他们的同一个属性值都是指向了同一个数组对象。

  D、混合的构造函数与原型方式:属性采用构造函数方式定义,方法采用原型方式定义
  特点1:每个实例对象的属性值互不影响,即同名的属性其值都是指向了不同的数据或对象。
  特点2:能够实现每个实例对象在构造时就能传递初始化信息
  特点3:每个实例对象共享方法,即每个实例对象的同名方法都是指向同一个匿名方法,即这个匿名方法不会因对象的创建而产生多个,它就只有一个
  弊端:类定义中属性和方法定义分开,整体性欠缺

  第一个示例:
  function(){
    this.username = new Array();
    this.password = "123";
  }
  Person.prototype.get = function(){
    alert("username: " + this.username + "\npassword: " + this.password);
  }
  var p = new Person();
  p.username.push("zhangsan");
  var p2 = new Person();
  p.get();
  p2.get();

  第二个示例:
  function Person(username,password){
    this.username = username;
    this.password = password;
  }
  Person.prototype.get = function(){
    alert("username: " + this.username + "\npassword: " + this.password);
  }
  var p = new Person("zhangsan","123");
  var p2 = new Person("lisi","123456");
  p.get();
  p2.get();

  E、动态的原型方式
  function Person(){
    this.username = "zhangsan";
    this.password = "123";
    if(typeof Person.flag == "undefined"){
      //使得在创建多个对象时,匿名方法只产生一次
      Person.prototype.get = function(){
        alert("username: " + this.username + "\npassword: " + this.password);
      }
      Person.flag = true;
    }
  }
  var person = new Person();
  person.get();
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics