JavaScript-工厂模式&&构造函数模式&&原型模式

ECMAScript是中没有类的概念,ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。

Object构造函数方法

创建自定义对象的最简单方式就是创建一个 Object 的实例,然后再为它添加属性和方法。这里的Object实际上是默认的构造函数

   var zw=new Object();
   zw.name="zw";
   zw.age=20;
   zw.job="student";
   zw.getName=function(){
       console.log(this.name);
   }
   zw.getName();//zw

使用字面量方法创建对象

字面量用来为变量赋值时的常数量

对象字面值是封闭在花括号对({})中的一个对象的零个或多个”属性名:值”列表。

   var zw={
        name:"zw",
        age:20,
        job:"student",
        getName:function(){
            console.log(this.name);
        }
   }
   console.log(zw);//{name: "zw", age: 20, job: "student", getName: ƒ}

控制台依次输出zw的属性和值,getName:f表示getName是一个函数。

虽然 Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。

工厂模式

 ECMAScript 中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节。

  function my(name,age,job){
       var zw=new Object();
       zw.name=name;
       zw.age=age;
       zw.job=job;
       zw.getName=function(){
           console.log(this.name);
       }
       return zw;
   }
   var per=my("zw",20,"student");
   console.log(per instanceof my);//false
   console.log(per instanceof Object);//true,因为在js中函数也是对象
   per.getName();//zw

工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型,譬如怎样测试出per这个对象是person这个类型的。

构造函数模式

  function my(name,age,job){
       this.name=name;
       this.age=age;
       this.job=job;
       this.getName=function(){
           console.log(this.name);
       }
      
   }
   var per=new my("zw",20,"student");
   console.log(per instanceof my);//true
   console.log(per instanceof Object);//true
   per.getName();//zw

与上面工厂模式不同的是:

  1. 没有显式地创建对象;
  2. 直接将属性和方法赋给了 this 对象;
  3. 没有 return 语句。

要创建 my 的新实例,必须使用 new 操作符。以这种方式调用构造函数实际上会经历以下 4个步骤:
    (1) 创建一个新对象;
    (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
    (3) 执行构造函数中的代码(为这个新对象添加属性);
    (4) 返回新对象。

而且这种模式下per保存了my的一个实例,per对象有一个constructor属性,该属性指向my。对象的 constructor 属性最初是用来标识对象类型的。但是,提到检测对象类型,还是用上面的 instanceof 操作符要更可靠一些。


                
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值