zoukankan      html  css  js  c++  java
  • 原生JS中的类、静态方法、继承以及单例模式

    原生JS中的类、静态方法、继承

    ES5中的实例方法和静态方法

    function Person(name,age){
    	//构造函数中的方法和属性
    	this.name = name;
    	this.age = age;
    	this.run = function(){
    		console.log(`${this.name}---${this.age}`)
    	}
    }
    
    //原型链上的属性和方法;可以被多个实例共享
    Person.prototype.sex = 'boy';
    Person.prototype.work = function(){
    	console.log(`${this.name}---${this.age}---${this.sex}`)
    }
    
    //静态方法
    Person.setName = function(){
    	console.log('static function')
    }
    
    //实例方法是通过实例化来调用的;静态方法是通过类名直接调用
    var p = new Person('smileyqp',18);
    p.run();
    p.work()
    
    Person.setName();	//执行静态方法
    

    ES5中的继承

    • 原型链+对象冒充的组合继承
    function Person(name,age){
    	//构造函数中的方法和属性
    	this.name = name;
    	this.age = age;
    	this.run = function(){
    		console.log(`${this.name}---${this.age}`)
    	}
    }
    //原型链上的属性和方法
    Person.prototype.work = function(){}
    
    function Web(name,age){
    	Person.call(this,name,age);		//1、对象冒充继承
    }
    Web.prototype = new Person();	//2、原型链继承
    
    var web = new Web('smileyqp',16);
    
    原型链继承和对象冒充集成的优缺点
    • 对象冒充继承:Person.call(this,name,age);

      • 缺点:

        • 没法继承原型链上的属性和方法

          //例如上面的代码
          web.run();		//smileyqp---16
          
          web.work();			//Not Found;因为这是原型链上的方法,对象冒充的方法不可以继承
          
    • 原型链继承:Web.prototype = new Person()

      • 优点:可以继承原型链上的属性和方法

      • 缺点:实例化的时候没法给父类传参

        Web.prototype = new Person();	
        //实例化的时候没有办法将参数`var web = new Web('smileyqp',16)`中参数传给父类进行实例化
        

    ES6中定义一个类(class)

    class Person{
    	//构造函数
    	constructor(name,age){
    		this._name = name;
    		this._age = age;
    	}
    	getName(){
    		console.log(this._name)
    	}
    	setName(name){
    		this._name = name;
    	}
    	getInfo(){
    		console.log(`name:${this.name};age:${this.age}`)
    	}
    }
    
    var p = new Person('smileyqp',20);	//实例化会执行构造函数
    p.setName('yqp')
    p.getName();	//yqp
    p.getInfo();	//name:smileyqp;age:20	这个getInfo方法是继承父类的getInfo方法
    

    ES6中继承(extends、super)

    class Web extends Person{
    	constructor(name,age,sex){
    		super(name,age);	//实例化自雷的时候将自雷的数据传递给父类
    		this.sex = sex;
    	}
    	proint(){
    		console.log(this.sex)
    	};
    }
    var w = new Web('smileyqp',18,'girl');
    w.print();	//girl
    

    ES6中静态方法

    class Person{
    	constructor(name,age,sex){		//构造方法
    		this.sex = sex;		//属性
    	}
    	proint(){		//实例方法
    		console.log(this.sex)
    	};
    	
    	//静态方法
    	static work(){
    	
    	}
    }
    //调用静态方法
    Person.work();
    
    
    //ES6中也可以直接给类绑定一个静态方法
    Person.instance = '这是一个实例,这是一个静态方法';
    
    console.log(Person.instance)
    

    单例模式

    有多个实例的时候构造函数只调用一次
    class Db{
        static getInstance(){       //单例
            if(!Db.instance){
                Db.instance = new Db();
            }
            return Db.instance;
        }
        constructor(){
            console.log('实例化会触发构造函数!')
            this.connect();
        }
    
        connect(){
            console.log('连接数据库!')
        }
        find(){
            console.log('查询数据库!')
        }
    }
    
    //d1会进入构造函数;实例化d2和d3则不会
    var d1 = Db.getInstance();
    var d2 = Db.getInstance();
    var d3 = Db.getInstance();
    
  • 相关阅读:
    《财富自由之路》读后感及读书笔记
    echarts3.x 入门
    Ubuntu 16.04 硬盘安装
    语义化版本控制的规范(转载)
    appcan IDE 无法 请求数据
    jQuery extend 函数
    63342 接口 奇遇 IDEA
    C++调用Java的Jar包
    无法打开 源 文件“stdafx.h”的解决方法
    CString的头文件
  • 原文地址:https://www.cnblogs.com/smileyqp/p/12675225.html
Copyright © 2011-2022 走看看