zoukankan      html  css  js  c++  java
  • 创建类的方式

    背景:

      ES6之前,也就是没有class关键字之前,JS一直使用的是函数和原型链结合的方式来创造类,下面就对于一些基本的方式来进行一个整合。

    具体方式:

      1. 工厂模式:

     1 function Person(name, age, job) {
     2     var o = new Object()
     3     o.name = name
     4     o.age = age
     5     o.job = job
     6     o.sayName = function () {
     7         alert(this.name)
     8     }
     9     return o
    10 }
    11 var person1 = Person()
    12 var person2 = Person()

      缺点:

        ①. 类的共同属性没有被明显区分;例如上面的person1对象和person2对象的sayName方法根本上不是用一个方法;

        ②. 如果使用这种方法创造大量的对象,那么会导致占用大量的内存空间。(因为每一个对象的sayName都占有内存空间)

     

      2. 构造函数模式

     1 function Person(name, age, job) {
     2     this.name = name
     3     this.age = age
     4     this.job = job
     5     this.sayName = function () {
     6         alert(this.name)
     7     }
     8 }
     9 var person1 = new Person()
    10 var person2 = new Person()

      缺点:(和工厂模式一致)

        ①. 类的共同属性没有被明显区分;例如上面的person1对象和person2对象的sayName方法根本上不是用一个方法;

        ②. 如果使用这种方法创造大量的对象,那么会导致占用大量的内存空间。(因为每一个对象的sayName都占有内存空间)

      3. 原型模式

     1 function Person(name, age, job) {
     2     this.name = name
     3     this.age = age
     4     this.job = job
     5 }
     6 Person.prototype = {
     7     constructor: Person,
     8     sayName: function () {
     9         alert("this.name")
    10     }
    11 }
    12 var person1 = new Person()
    13 var person2 = new Person()

      特性:

        解决了工厂模式和构造函数模式的问题。

      缺点:

        ①. 原型的公共属性是可以被任意一个原型对象修改的

      4. 动态原型模式:该模式个人还不知道其应用场景

     1 function Person(name, age, job) {
     2     this.name = name
     3     this.age = age
     4     this.job = job
     5     if (typeof this.sayName != "function") {
     6         Person.prototype.sayName = {
     7             alert("this.name")
     8         }
     9     }
    10 }
    11 var person1 = new Person()
    12 var person2 = new Person()

      5. 稳妥构造函数模式

     1 function Person(name, age, job) {
     2     var o = new Object()
     3     pname = name
     4     page = age
     5     pjob = job
     6     o.sayName = function () {
     7            alert(this.name)
     8     }
     9     return o
    10  }
    11 var person1 = Person()
    12 var person2 = Person()

      特性:

        ①. 这种模式提供了一种创造私有变量的方法,在外层,除了对象暴露的函数,其他方式不能访问变量

      缺点:

        ①. 类的共同属性没有被明显区分;例如上面的person1对象和person2对象的sayName方法根本上不是用一个方法;

        ②. 如果使用这种方法创造大量的对象,那么会导致占用大量的内存空间。(因为每一个对象的sayName都占有内存空间)

    参考资料:

      1. JavaScript高级程序设计第六章(第三版)

  • 相关阅读:
    谦卑
    自尊和自我效能
    二手时间读书笔记
    vim学习4
    vim学习3
    hdu 5122 K.Bro Sorting
    hdu 5113 Black And White
    poj 2479 Maximum sum
    poj 2392 Space Elevator
    poj 3666 Making the Grade
  • 原文地址:https://www.cnblogs.com/oulae/p/11173140.html
Copyright © 2011-2022 走看看