定义JavaScript类:工厂模式、构造函数模式、原型模式、构造函数原型模式、动态原型模式

简介:

1    工厂模

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script type= "text/javascript" >
         //通过包装函数封装模具
         function  wrapBook(title,pages){
             var  book =  new  Object ();
             //申明属性并接收参数
             book.title = title;
             book.pages = pages;
             book.what =  function (){
                 alert( this .title+ ":" + this .pages);
             }
             return  book;    //返回初始化后的对象
         }
          window.onload =  function (){
              //调用模具快速生产
              //var book1 = wrapBook("JavaScript权威指南",600);
              //var book2 = wrapBook("Dojo权威指南",390);
              var  book1 =  new  wrapBook( "JavaScript权威指南" , 600 );
              var  book2 =  new  wrapBook( "Dojo权威指南" , 390 );
              book1.what();
              book2.what();
              console.dir(book1);
              console.dir(book2);
          }
     </script>

 问题:上面方法what()封装在图书模具函数wrapBook结构中,这样每生产一本书,该函数就被创建一次,也就是说,每本书都有一个相同的方法,造成资源浪费。

  解决:把方法what()分离出来,在模具中引用该方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script type= "text/javascript" >
         //申明一个全局变量
         what =  function  (){
             alert( this .title+ ":" + this .pages);
         }
         //通过包装函数封装模具
         function  wrapBook(title,pages){
             var  book =  new  Object ();
             //申明属性并接收参数
             book.title = title;
             book.pages = pages;
             book.what = what;    //引用全局方法的引用指针
             return  book;    //返回初始化后的对象
         }
          window.onload =  function (){
              //调用模具快速生产
              //var book1 = wrapBook("JavaScript权威指南",600);
              //var book2 = wrapBook("Dojo权威指南",390);
              var  book1 =  new  wrapBook( "JavaScript权威指南" , 600 );
              var  book2 =  new  wrapBook( "Dojo权威指南" , 390 );
              book1.what();
              book2.what();
              console.dir(book1);
              console.dir(book2);
          }
     </script>


2    构造函数模式


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//构造函数模型
         function  Book(title,pages){
             //构造函数属性
             this .title = title;
             this .pages = pages;
             //构造函数方法
             this .what =  function  (){
                 alert( this .title+ ":" + this .pages);
             }
         }
          window.onload =  function (){
              //实例化构造函数,并传递参数
              var  book1 =  new  Book( "JavaScript权威指南" , 600 );
              var  book2 =  new  Book( "Dojo权威指南" , 390 );
              book1.what();
              book2.what();
              console.dir(book1);
              console.dir(book2);
          }
     </script>


      备注:构造函数模式只能使用new运算符进行调用,不能使小括号()来调用。

       问题:类似于工厂模式,造成what()方法重复创建。


3    原型模式

     采用函数的prototype属性来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script type= "text/javascript" >
        //使用构造函数定义一个空类
        function  Book(){ }
       //为原型申明属性并初始化
        Book.prototype.title =  "图书名称" ;
        Book.prototype.pages =  120 ;
        //为原型申明一个方法
        Book.prototype.what =  function  (){
                alert( this .title+ ":" + this .pages);
        }
         window.onload =  function (){
             //实例化构造函数,并传递参数
             var  book1 =  new  Book();
             var  book2 =  new  Book();
             book1.what();
             book2.what();
             console.dir(book1);
             console.dir(book2);
         }
    </script>


4    构造函数原型模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<script type= "text/javascript" >
         //构造函数模式设计
         function  Book(title,pages){
             //构造函数属性
             this .title = title;
             this .pages = pages;
         }
         //原型模式设计
         Book.prototype.what =  function  (){
                 alert( this .title+ ":" + this .pages);
         }
          window.onload =  function (){
              //实例化构造函数,并传递参数
              var  book1 =  new  Book( "JavaScript权威指南" , 600 );
              var  book2 =  new  Book( "Dojo权威指南" , 390 );
              book1.what();
              book2.what();
              console.dir(book1);
              console.dir(book2);
          }
     </script>

   备注:推荐采用此模式。


5     动态原型模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<script type= "text/javascript" >
         //构造函数模式设计
         function  Book(title,pages){
             //构造函数属性
             this .title = title;
             this .pages = pages;
             //原型模式设计,位于类的内部
             Book.prototype.what =  function  (){
                 alert( this .title+ ":" + this .pages);
             }
         }
          window.onload =  function (){
              //实例化构造函数,并传递参数
              var  book1 =  new  Book( "JavaScript权威指南" , 600 );
              var  book2 =  new  Book( "Dojo权威指南" , 390 );
              book1.what();
              book2.what();
              console.dir(book1);
              console.dir(book2);
          }
     </script>

   问题:当每次实例化时,类中包含的原型方法就会被创建一次,造成资源浪费。

   解决:安装一个判断开关,检测该方法是否已经创建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<script type= "text/javascript" >
        //构造函数模式设计
        function  Book(title,pages){
            //构造函数属性
            this .title = title;
            this .pages = pages;
            //创建原型方法的锁,如果不存在,就创建该方法
            if ( typeof  Book.isLock ==  "undefined" ){
                Book.prototype.what =  function  (){
                    alert( this .title+ ":" + this .pages);
                };
                //创建原型方法后,把锁锁上,避免重复创建
                Book.isLock =  true ;
            }
        }
         window.onload =  function (){
             //实例化构造函数,并传递参数
             var  book1 =  new  Book( "JavaScript权威指南" , 600 );
             var  book2 =  new  Book( "Dojo权威指南" , 390 );
             book1.what();
             book2.what();
             console.dir(book1);
             console.dir(book2);
         }
    </script>


       总结:目前使用最广泛的是混合的构造函数/原型方式。此外,动态原型方法也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。







     本文转自stock0991 51CTO博客,原文链接:http://blog.51cto.com/qing0991/1363513,如需转载请自行联系原作者










相关文章
|
2月前
|
前端开发 JavaScript UED
探索JavaScript中的异步编程模式
【10月更文挑战第21天】在数字时代的浪潮中,JavaScript作为一门动态的、解释型的编程语言,以其卓越的灵活性和强大的功能在Web开发领域扮演着举足轻重的角色。本篇文章旨在深入探讨JavaScript中的异步编程模式,揭示其背后的原理和实践方法。通过分析回调函数、Promise对象以及async/await语法糖等关键技术点,我们将一同揭开JavaScript异步编程的神秘面纱,领略其带来的非阻塞I/O操作的魅力。让我们跟随代码的步伐,开启一场关于时间、性能与用户体验的奇妙之旅。
|
19天前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第33天】在JavaScript的世界里,异步编程是提升应用性能和用户体验的关键。本文将带你深入理解异步编程的核心概念,并展示如何在实际开发中运用这些知识来构建更流畅、响应更快的Web应用程序。从回调函数到Promises,再到async/await,我们将一步步解锁JavaScript异步编程的秘密,让你轻松应对各种复杂的异步场景。
|
3月前
|
Web App开发 JavaScript 前端开发
JavaScript 类(class)
JavaScript 类(class)
22 2
JavaScript 类(class)
|
2月前
|
JavaScript 前端开发 API
探索Node.js中的异步编程模式
【10月更文挑战第4天】在JavaScript的世界中,异步编程是提升应用性能和用户体验的关键。本文将深入探讨Node.js中异步编程的几种模式,包括回调函数、Promises、async/await,并分享如何有效利用这些模式来构建高性能的后端服务。
|
2月前
|
JavaScript 前端开发 调度
探索Node.js中的异步编程模式
在Node.js的世界里,异步编程是核心。本文将带你深入了解异步编程的精髓,通过代码示例和实际案例分析,我们将一起掌握事件循环、回调函数、Promises以及async/await等关键概念。准备好迎接挑战,让你的Node.js应用飞起来!
|
2月前
|
JavaScript 前端开发 开发者
探索Node.js中的异步编程模式
【9月更文挑战第33天】在JavaScript的后端领域,Node.js凭借其非阻塞I/O和事件驱动的特性,成为高性能应用的首选平台。本文将深入浅出地探讨Node.js中异步编程的核心概念、Promise对象、Async/Await语法以及它们如何优化后端开发的效率和性能。
25 7
|
2月前
|
存储 JavaScript 前端开发
Vue.js项目中全面解析定义全局变量的常用方法与技巧
Vue.js项目中全面解析定义全局变量的常用方法与技巧
43 0
|
3月前
|
JavaScript 前端开发
js函数调用与定义
js函数调用与定义
|
3月前
|
JavaScript 前端开发 Java
JavaScript 类知识点概览
概览JavaScript中类的知识点,包括类的定义和实现、添加方法和get/set方法、类的继承和静态方法的使用。通过学生类和人员类的例子,演示了类的构造器、方法定义、继承关系和静态方法的调用。
JavaScript 类知识点概览
|
3月前
|
JavaScript 前端开发 开发者
JavaScript 类继承
JavaScript 类继承
22 1
下一篇
无影云桌面