• JavaScript中的设计模式


    目录

    1.工厂模式

    2.构造函数模式

    构造函数中new关键字作用:

    3.原型模式

    4.组合模式


    JavaScript中有四种常见的设计模式 ,目的是为了批量创建对象 为了实现继承。

    1.工厂模式

    利用工厂模式批量创建对象 
        优点:可以批量创建对象 
        缺点:无法区分种类,创建实例对象都是Object实例,方法冗余

    1. var sayName = function(){
    2. console.log(this.name)
    3. };//b1001
    4. function Person(name,age,gender){
    5. return {
    6. name:name,
    7. age:age,
    8. gender:gender,
    9. sayName:sayName
    10. }
    11. }
    12. var p1 = Person('terry',12,'male');
    13. var p2 = Person('larry',18,'female');
    14. console.log(p1,p2);
    15. p1.sayName();
    16. p2.sayName();
    17. console.log(p1.sayName===p2.sayName);
    18. function Animal(){
    19. return {
    20. }
    21. }
    22. var a1 = Animal();
    23. console.log(a1);

     代码运行结果如下:



    2.构造函数模式

        优点:可以批量创建对象 可以区分种类 Person{} Animal{}
        缺点:无法解决方法冗余 

    1. var sayName = function(){
    2. console.log(this.name)
    3. }
    4. function Person(name,age,gender){
    5. // new Object() new Array()
    6. this.name = name;
    7. this.age = age;
    8. this.gender = gender;
    9. this.sayName = sayName;
    10. }
    11. var p1 = new Person('terry',12,'male');
    12. var p2 = new Person('larry',18,'female');
    13. console.log(p1,p2);
    14. console.log(p1.sayName===p2.sayName);
    15. p1.sayName();
    16. p2.sayName();
    17. function Animal(){
    18. }
    19. var a1 = new Animal();
    20. console.log(a1);
    构造函数中new关键字作用:

            1.创建一个Person对应的实例 
            2.将this指向实例对象
            3.执行函数体代码
            4.返回实例对象

    代码运行结果如下:


    3.原型模式

        不单独使用    构造函数不做任何处理将实例所有属性和方法全部写在原型对象中

            优点:可以区分种类 可以批量创建对象 方法不冗余

            缺点:所有实例方法和属性一样

    1. function Person(){};
    2. Person.prototype.name = 'lisi';
    3. Person.prototype.age = 12;
    4. Person.prototype.gender = 'male';
    5. Person.prototype.sayName = function(){
    6. console.log(this.name);
    7. };
    8. Person.prototype.firends = [];
    9. var p1 = new Person();
    10. var p2 = new Person();
    11. console.log(p1,p2);
    12. console.log(p1.name,p2.name,p1.sayName(),p2.sayName());
    13. p1.firends.push('tom');
    14. console.log(p1.firends,p2.firends);

    代码运行结果如下:
     


    4.组合模式

          构造函数模式 + 原型模式
          将实例私有属性和私有方法放在构造函数中
          将实例公共属性和公共方法放在原型对象中

    1. function Person(name,age,gender,weight){
    2. // 私有属性
    3. this.name = name;
    4. this.age = age;
    5. this.gender = gender;
    6. // 私有方法
    7. this.weight = function(){
    8. console.log(weight)
    9. }
    10. }
    11. // // 公共方法
    12. // Person.prototype.sayName = function(){
    13. // console.log(this.name);
    14. // }
    15. // // 公共属性
    16. // Person.prototype.type = 'Person实例';
    17. // 简化上述代码
    18. Person.prototype = {
    19. // 将构造者改为Person
    20. constructor:Person,
    21. sayName:function(){
    22. console.log(this.name)
    23. },
    24. type:'Person实例'
    25. };
    26. var p1 = new Person('terry',16,'male','40kg');
    27. var p2 = new Person('larry',18,'female','60kg');
    28. p1.sayName();
    29. p2.sayName();
    30. console.log(p1.sayName === p2.sayName,p1.type === p2.type);
    31. console.log(p1.type,p2.type);
    32. p1.weight();
    33. p2.weight();
    34. console.log(p1.weight === p2.weight);
    35. console.log(p1.constructor,p2.constructor);
    36. // instanceof 检测实例在不在原型链中 是否是构造函数实例
    37. console.log(p1 instanceof Person);
    38. console.log(p1 instanceof Object);
    39. console.log(p1 instanceof Array);
    40. console.log(Person instanceof Object);
    41. function Animal(){};
    42. console.log(Animal instanceof Object);

    代码运行结果如下:


  • 相关阅读:
    Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups
    ros gdb调试
    计算机竞赛 深度学习火车票识别系统
    React Native 创建新项目详细教程
    java锁之ReentrantLock及Condition
    CPU的运行与其对线程的影响
    工程师应该掌握的10个超经典模拟电路
    wqs二分学习笔记
    [分布式算法] 生成树广播与敛播
    Redis持久化
  • 原文地址:https://blog.csdn.net/l12345666777/article/details/134534624