• JS创建对象的几种方式


    第一:工厂模式:代码如下

    缺点:对象无法识别,因为原型都指向(Object)

     function Person(name) {
        var obj = new Object();
        obj.name = name;
        obj.say = function () {
            return "我是" + this.name;
        }
        return obj
    }
    var person = Person("Ayden") console.log(person.name)//Ayden console.log(person.say())//我是Ayden

    第二:构造函数模式:代码如下

    优点:实例可以识别为一个特定的类型,即可以分 ‘类’ 

    缺点:每次创建实例时每个方法都要被创建一次

    function Person(name) {
       this.name = name ;
       this.say = function () {
           return "我是" + this.name ;
       }
    }
    var person = new Person("Ayden")
    console.log(person)

    构造模式优化:代码如下

    优点:解决了 “每次创建实例时每个方法都要被创建一次“” 的问题

    缺点:面向对象三大特性之一——封装。这叫啥封装?

    function Person(name) {
        this.name = name ;
        this.say = say
    }
    function say() {
        return "我是" + this.name;
    }
    var person = new Person("Ayden")
    console.log(person)

    第三:原型模式:代码如下

    优点:实例的方法不会重新创建

    缺点:1. 所有的属性和方法都共享 2. 不能初始化参数 3.总想把代码写到一起,即封装

    function Person() {
            
    }
    Person.prototype.name = "Ayden";
    Person.prototype.say = function () {
        return "我是" + this.name
    }
    var person = new Person();
    console.log(person)

    原型模式优化:代码如下

    优点:封装性好些

    缺点:丢失了constructor属性

    function Person() {
    
    }
    Person.prototype = {
        name :"Ayden",
        say :function () {
             return "我是" + this.name
        }
    }
    var person = new Person()

    原型模式再优化:

    优点:实例可以通过constructor属性找到所属构造函数

    缺点:1. 所有的属性和方法都共享 2. 不能初始化参数 

    function Person() {
    
    }
    Person.prototype = {
       constructor: Person, 
       name: "Ayden",
       say: function () {
            return "我是" + this.name
        }
    }
    var person = new Person()

    第四:混合模式:代码如下:

    优点:该私有的私有,该共享的共享(使用最广泛的方式)

    缺点:希望全部写在一起,即更好的封装性

     function Person(name) {
            this.name = name ;
        }
        Person.prototype = {
            say:function () {
                return "我是" + this.name
            }
        }
        var person1 = new Person("Ayden");
        var person2 = new Person("Tom")
  • 相关阅读:
    请求转发和请求重定向的区别
    查看电脑连过的WiFi密码
    linux mysql不能远程登录
    map的遍历方法
    ________________springbootのMybatis
    ________________springbootのTest
    ________________springbootの自定义starter
    ________________springbootのAOP
    ________________springbootのjdbc、事物
    ________________初学springboot14
  • 原文地址:https://www.cnblogs.com/kaw19950302/p/7854205.html
Copyright © 2020-2023  润新知