zoukankan      html  css  js  c++  java
  • js创建对象的5中经典方式

    第一种:传统模式,也称作“工厂模式”,不推荐使用,但要了解。

    于是早期js程序员有了工厂模式的一个变体:
    function createPerson(name,age){
      var c=new Object();
      c.name=name; c.age=age;
      c.sayName=function(){alert(this.name);};
      return c
    }
    var p1 = createPerson("james",27);
    var p2 = createPerson("coook",24);
    p1.sayName(); p2.sayName();
     说明:
    1.在函数中定义对象,并定义对象的各种属性,,虽然属性可以为方法,但是建议将属性为方法的属性定义到函数之外,这样可以避免重复创建该方法
    2.引用该对象的时候,这里使用的是 var x = Parent()而不是 var x = new Parent();因为后者会可能出现很多问题(前者也成为工厂经典方式,后者称之为混合工厂方式),不推荐使用new的方式使用该对象
    3.在函数的最后返回该对象  
    缺点:每次都要创建这样的一个“类”的对象,麻烦。 
    第二种:构造函数模式。
    function Person(name,age){
      this.name=name;
      this.age=age;
      this.sayName=function(){alert(this.name);};
    }
    var p1 = new Person("james",27);
    var p2 = new Person("coook",24);
    p1.sayName(); p2.sayName();
    new关键字:
    0开辟堆空间 1创建对象;2将构造函数作用域赋值给新对象(this就指向了该新对象);3执行构造函数中的代码(为新对象添加属性);4返回新对象
    注意: 
    构造函数模式缺点:每个实例上都有自定义的各个方法对象,没必要啊,消耗内存资源。
    说明:
    1.与工厂方式相比,使用构造函数方式创建对象,无需再函数内部重建创建对象,而使用this指代,并而函数无需明确return
    2.同工厂模式一样,虽然属性的值可以为方法,扔建议将该方法定义在函数之外
    3..同样的,不推荐使用这种方式创建对象,但仍需要了解
    第三种模式:原型模式。
    function LcjMan(name, age) {
    this.name = name;
     this.age = age;
    }
    LcjMan.prototype.sayName = function () {
    alert(this.name);
    }
    var jierui = new LcjMan("jime", 22);
    var chuanjie = new LcjMan("chuanjie", 23);
     jierui.sayName();//---打印出jime
    chuanjie.sayName(); //---打印出chuanjie
    第四种模式:混合的构造函数,原型方式(推荐) 

      function LcjMan(name, age) {
     this.name = "小明";
     this.age =23;
    }
    LcjMan.prototype.sayName = function () {

    return this.name; 

     } 

     var lcj=new LcjMan();

    alert(lcj.sayName()); 

     说明:1.该模式是指混合搭配使用构造函数方式和原型方式
     2.将所有属性不是方法的属性定义在函数中(构造函数方式)
    将所有属性值为方法的属性利用prototype在函数之外定义(原型方式) 

    第五种模式:动态原型方式

    function Parent(){
     this.name="李连杰"; 
     this.age=32; 
     if(typeof Parent._lev=="undefined"){ 
     Parent.prototype.lev=function(){ 
    return this.name;
    }
    Parent._lev=true;
     } 
    }; 
    var x =new Parent(); 
    alert(x.lev());  

     说明:
    1.动态原型方式可以理解为混合构造函数,原型方式的一个特例
    2.该模式中,属性为方法的属性直接在函数中进行了定义,但是因为
    Js代码
    if(typeof Parent._lev=="undefined"){ 
     Parent._lev=true;} 
    从而保证创建该对象的实例时,属性的方法不会被重复创建 

  • 相关阅读:
    centos 安装 TortoiseSVN svn 客户端
    linux 定时任务 日志记录
    centos6.5 安装PHP7.0支持nginx
    linux root 用户 定时任务添加
    composer 一些使用说明
    laravel cookie写入
    laravel composer 安装指定版本以及基本的配置
    mysql 删除重复记录语句
    linux php redis 扩展安装
    linux php 安装 memcache 扩展
  • 原文地址:https://www.cnblogs.com/flyrock/p/2229521.html
Copyright © 2011-2022 走看看