zoukankan      html  css  js  c++  java
  • javascript 设计模式

    1.构造函数模式解释

    构造函数用来创建特定的实例,具有特定的参数属性和方法。

    2.代码解释

    1.基本构造函数

    function Person(sex, age, weight) {
        this.sex = sex
        this.age = age
        this.weight = weight
        this.say = function() {
            console.log(this.sex, this.age, this.weight)
        }
    }
    var xiaoming = new Person('男', 18, 60)
    var xiaohong = new Person('女', 18, 50)
    xiaoming.say()  //男 18 60
    xiaohong.say()  //女 18 50

    上述代码便是最基础的构造函数,通过new来构建一个实例,每个实例上面都有自己的属性和方法。

    上述实例公共方法可以提取一下,通过原型继承来实现

    2.改造构造函数

    function Person(sex, age, weight) {
        this.sex = sex
        this.age = age
        this.weight = weight
    }
    Person.prototype.say = function() {
        console.log(this.sex, this.age, this.weight)
    }
    var xiaoming = new Person('男', 18, 60)
    var xiaohong = new Person('女', 18, 50)
    xiaoming.say()   //男 18 60
    xiaohong.say()   //女 18 50

    通过简单的在原型上定义公共方法,每次构建实例不需要重新定义方法,节省内存,构建后的实例可以重原型上找到该方法的定义。其实可以在改进,如果这个构造函数没执行,那么也不需要在原型上定义方法。

    3.动态原型构造函数

    function Person(sex, age, weight) {
        this.sex = sex
        this.age = age
        this.weight = weight
        if(typeof Person._initFun === 'undefined') {
            Person.prototype.say = function() {
                console.log(this.sex, this.age, this.weight)
            }
            Person._initFun = true
        }
    }
    var xiaoming = new Person('男', 18, 60)
    var xiaohong = new Person('女', 18, 50)
    xiaoming.say()   //男 18 60
    xiaohong.say()   //女 18 50        

    该实现原来就是通过一个标志位判断是否是第一次构建实例,这样的好处是没有构建实例是不会在原型上定义方法,只有构建实例且第一次构建的时候才会在原型上定义方法。之后再构建实例便不会再次在原型上重复定义。

    4.强制new关键词

    我们知道构建词new能用来构建实例,如果不用new,this便会指向window,这样是不太好。所以改造一下构造函数

    function Person(sex, age, weight) {
        if (!(this instanceof Person)) {
            return new Person(sex, age, weight);
        }
        this.sex = sex
        this.age = age
        this.weight = weight
        if(typeof Person._initFun === 'undefined') {
            Person.prototype.say = function() {
                console.log(this.sex, this.age, this.weight)
            }
            Person._initFun = true
        }
    }
    var xiaoming = new Person('男', 18, 60)
    var xiaohong = Person('女', 18, 50)
    xiaoming.say()  //男 18 60
    xiaohong.say()  //女 18 50            

    构建实例首先会判断是否this对象的instanceof是否属于Person,如果不是则强制返回Person实例,否则执行下面的参数定义代码。

    end!!!

  • 相关阅读:
    url-pattern / /*匹配
    velocity入门
    配置eclipse插件
    Myeclipse 2014 破解
    Eclipse kepler 安装 Dynamic Web Project差距WTP
    Errors running builder 'Faceted Project Validation Builder' on project
    JSF web.xml的各类参数属性配置
    bpm 学习笔记一
    love is ... ...
    .sh_history文件的管理机制
  • 原文地址:https://www.cnblogs.com/lyjfight/p/13920459.html
Copyright © 2011-2022 走看看