• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

cynchanpin

  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

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"

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

posted on 2017-07-17 15:00  cynchanpin  阅读(187)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3