zoukankan      html  css  js  c++  java
  • javascript创建对象总结(javascript高级程序设计)

    1.工厂模式

    这样的模式抽象创建详细对象的过程。用函数封装特定的接口来创建类。
    
    
        function createStudent(name) {
            var o = new Object();
            o.name = name;
            o.sayName = function() {
                alert(this.name);
            };
            return o;
        }
        var student1 = createStudent("Tom");
    解决的问题:攻克了创建多个类似对象的问题
    缺点:没有解决对象识别问题
    

    2.构造函数模式

        function Student(name) {
            this.name = name;
            this.sayName = function() {
                alert(this.name);
            };
        }
        var student1 = new Student("Tom");
        var student2 = new Student("Suen");

    这样的模式创建Student的新实例,必须使用new操作符。调用构造函数会经过例如以下4步骤:(1)创建一个新对象; (2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象); (3)运行构造函数中的代码(为这个新对象加入属性) (4)返回新对象

    解决的问题:对象识别问题,能够通过constructor属性和instanceof操作符来检測对象类型:

            alert(student1.constructor == Student) //true
            alert(student2 instanceof Object) //true
            alert(student2 instanceof Student) //true

    缺点:每一个方法都要在每一个实例上又一次创建一遍。比方上面的样例,student1和student2的sayName()不是同一个Function的实例,这是不必要的。

    3.原型模式

    我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象。这个对象的用途就是包括全部实例共享的属性和方法。

        function  Student() {
        }
        Student.prototype.name = "Tom";
        Student.prototype.sayName = function(){
            alert(this.name);
        };
        var student1 = new Student("Tom");
        var student2 = new Student("Suen");
        alert(student1.sayName == student2.sayName); //true

    这里写图片描写叙述

        更简单的原型语法:
        function Student(){
        }
        Student.prototype = {
            constructor : Student,
            name : "Tom",
            sayName : function() {
                alert(this.name);
            }
        };

    解决的问题:全部对象实例共享原型中方法,不须要又一次创建。


    缺点:它省略了为构造函数初始化參数环节。导致全部实例在默认情况下都取得同样的属性值。

    更严重的是原型中的属性被非常多实例共享。尽管能够通过实例中加入同名属性解决,可是对于包括引用类型值的属性来说,问题就比較突出。

    4.组合使用构造函数模式和原型模式

    构造函数模式用于定义实例属性。而原型模式定义方法和共享的方法。

    每一个实例都会有自己的一份实例属性的副本。同一时候又共享着对方法的引用。

        function Student(name) {
            this.name = name;
            this.roommates = ["John","Ben"];
        }
        Student.prototype = {
            constructor : Student,
            sayName : function() {
                alert(this.name);
            }
        };
    
        var student1 = new Student("Tom");
        var student2 = new Student("Suen");
    
        student1.roommates.push("Jim");
        alert(student1.roommates); // "John, Ben, Jim"
        alert(student2.roommates); // "John, Ben"

    这样的模式是使用最广泛,认可度最高的模式。

  • 相关阅读:
    保留最大的数
    彩色宝石项链
    [leetcode] 403. Frog Jump
    [leetcode] 402. Remove K Digits
    Linux 更改时区、时间
    Linux系统时间同步方法
    mysql 5.7.28 地理位置计算详解
    springboot微服务项目集成为单体
    地理空间数据Geometry在MySQL中使用(一)
    mysql中geometry类型的简单使用
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7194281.html
Copyright © 2011-2022 走看看