zoukankan      html  css  js  c++  java
  • JS中定义对象的几种方式

    JS中定义对象的几种方式

    • 字面量及基于已有对象扩充其属性和方法
    • 工厂模式
    • 构造函数的方式
    • 基于原型(prototype)的方式
    • 动态原型的方式
    • ES6的Class

    一,字面量及基于已有对象扩充其属性和方法

    let obj = {}
    obj.name = 'Jett'
    obj.sayHello = function () {
      console.log('Hello, ', this.name)
    }
    View Code

    弊端: 可复用性不强(只适用于临时生成的一个对象),如果需要使用多个对象,还需要重新扩展其属性和方法

    二,工厂模式

    function createObject(username, password) {
      let object = new Object();
    
      object.username = username;
      object.password = password;
    
      object.get = function () {
        alert(this.username + ", " + this.password);
      }
    
      return object;
    }
    View Code

    工厂模式的实质还是基于已有对象扩充其属性和方法,只不过把创造对象的方法封装了,当需要创建多个对象的时候不需要重复写代码。

    不过上面的有个缺陷就是每次创建对象的时候,对象的对应的方法都会被创建一次,即方法不能被创建的所有对象共享。

    优化:

    let get = function () {
        alert(this.username + ", " + this.password);
    }
    function createObject(username, password) {
      let object = new Object();
    
      object.username = username;
      object.password = password;
    
      object.get = get
    
      return object;
    }
    View Code

    扩展:JS实现单例模式

    let Singleton = function( name ){
        this.name = name;
    };
    
    Singleton.prototype.getName = function(){
       alert(this.name);
    };
    
    Singleton.getInstance = (function(){ 
      let instance = null;
      return function (name) {
        if (!instance) {
          instance = new Singleton(name);
        }
        return instance;
      }
    })();
    View Code

    三,构造函数方式

    function Person (username, password) {
      //在执行第一行代码前,js引擎会为我们生成一个对象
      this.username = username;
      this.password = password;
      this.getInfo = function () {
        alert(this.username + ", " + this.password);
      } 
      //此处有一个隐藏的return语句,用于将之前生成的对象返回
      //只有在后面用new来调用构造函数的情况下,才会出现注释所述的这两点情况
    }
    View Code

    该方法的弊端也是跟工厂模式类似,对于一些公有的方法需要重复声明

    四,基于原型prototype

    对象会从其原型上继承属性和方法,所以我们可以把公有的属性放在原型上,把私有的属性放在构造函数内部

    原型+构造函数

    //使用原型+构造函数方式来定义对象
    function Person (username, password) {
      //在执行第一行代码前,js引擎会为我们生成一个对象
      this.username = username;
      this.password = password;
      //此处有一个隐藏的return语句,用于将之前生成的对象返回
      //只有在后面用new来调用构造函数的情况下,才会出现注释所述的这两点情况
    }
    // 在构造函数的原型属性上添加公有方法/属性
    Person.prototype.getInfo = function() {
      alert(this.username + ", " + this.password);
    }
    View Code

    五,动态原型的方式

    在构造函数内部通过标志量让所有对象共享一个方法

    //使用原型+构造函数方式来定义对象
    function Person (username, password) {
      //在执行第一行代码前,js引擎会为我们生成一个对象
      this.username = username;
      this.password = password;
      //此处有一个隐藏的return语句,用于将之前生成的对象返回
      //只有在后面用new来调用构造函数的情况下,才会出现注释所述的这两点情况
      if (Person.flag === undefined) {
        // 在构造函数的原型属性上添加公有方法/属性
        Person.prototype.getInfo = function() {
          alert(this.username + ", " + this.password);
        }
        Person.flag = true
      }
    }
    View Code

    没多大意义,跟四区别不大

    六,ES6 的Class

    在Class的构造函数中的属性为私有属性,Class内声明的方法为公有属性

    class Person {
      constructor (username, password) {
        // 定义私有属性
        this.username = username;
        this.password = password;
      }
      // 公有方法
      getInfo = function() {
          alert(this.username + ", " + this.password);
      }
    }
    View Code
  • 相关阅读:
    CSS margin重叠 & CSS BFC(Block Formatting Context)
    require.js
    bind()函数的作用
    JavaScript DOM 总结
    插入排序-直接插入排序、希尔排序
    交换排序-起泡排序、快速排序算法
    JavaScript全局函数
    JavaScript命名空间的理解与实现
    document.documentElement.clientWidth
    Python-删除多级目录
  • 原文地址:https://www.cnblogs.com/jett-woo/p/12693445.html
Copyright © 2011-2022 走看看