281 对象的创建模式:Object构造函数模式,对象字面量模式,构造函数模式,工厂模式,构造函数+原型的组合模式

  • Object构造函数模式

    p = new Object()
    p.name = 'aa'
    p.age = 11
    p.setName = function(name){this.name=name}
    console.log(p);  // {name: "aa", age: 11, setName: ƒ}
    

  • 对象字面量模式

    var obj = {
      name : 'Tom',
      setName : function(name){this.name = name}
    }
    

  • 构造函数模式

    function Person(name, age) {
      this.name = name;
      this.age = age;
      this.setName = function(name){this.name=name;};
    }
    new Person('tom', 12);
    

  • 构造函数+原型的组合模式

    function Person(name, age) {
      this.name = name;
      this.age = age;
    }
    Person.prototype.setName = function(name){this.name=name;};
    new Person('tom', 12);
    

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>01_Object构造函数模式</title>
</head>

<body>
    <!--
方式一: Object构造函数模式
  * 套路: 先创建空Object对象, 再动态添加属性/方法
  * 适用场景: 起始时不确定对象内部数据
  * 问题: 语句太多
-->
    <script type="text/javascript">
        // 一个人: name:"Tom", age: 12
        // 先创建空Object对象
        var p = new Object()
        p = {} //此时内部数据是不确定的
            // 再动态添加属性/方法
        p.name = 'Tom'
        p.age = 12
        p.setName = function(name) {
            this.name = name
        }

        //测试
        console.log(p.name, p.age)
        p.setName('Bob')
        console.log(p.name, p.age)
    </script>
</body>

</html>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>02_对象字面量</title>
</head>

<body>
    <!--
方式二: 对象字面量模式
  * 套路: 使用{}创建对象, 同时指定属性/方法
  * 适用场景: 起始时对象内部数据是确定的
  * 问题: 如果创建多个对象, 有重复代码
-->
    <script type="text/javascript">
        var p = {
            name: 'Tom',
            age: 12,
            setName: function(name) {
                this.name = name
            }
        }

        //测试
        console.log(p.name, p.age)
        p.setName('JACK')
        console.log(p.name, p.age)

        var p2 = { //如果创建多个对象代码,很重复
            name: 'Bob',
            age: 13,
            setName: function(name) {
                this.name = name
            }
        }
    </script>
</body>

</html>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>03_工厂模式</title>
</head>

<body>
    <!--
方式三: 工厂模式
  * 套路: 通过工厂函数动态创建对象并返回
  * 适用场景: 需要创建多个对象
  * 问题: 对象没有一个具体的类型, 都是Object类型
-->
    <script type="text/javascript">
        function createPerson(name, age) { // 返回一个对象的函数 ===>工厂函数
            var obj = {
                name: name,
                age: age,
                setName: function(name) {
                    this.name = name
                }
            }

            return obj
        }

        // 创建2个人
        var p1 = createPerson('Tom', 12)
        var p2 = createPerson('Bob', 13)

        // p1/p2是Object类型

        function createStudent(name, price) {
            var obj = {
                name: name,
                price: price
            }
            return obj
        }
        var s = createStudent('张三', 12000)
            // s也是Object
    </script>
</body>

</html>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>04_自定义构造函数模式</title>
</head>

<body>
    <!--
方式四: 自定义构造函数模式
  * 套路: 自定义构造函数, 通过new创建对象
  * 适用场景: 需要创建多个类型确定的对象
  * 问题: 每个对象都有相同的数据, 浪费内存
-->
    <script type="text/javascript">
        //定义类型
        function Person(name, age) {
            this.name = name
            this.age = age
            this.setName = function(name) {
                this.name = name
            }
        }
        var p1 = new Person('Tom', 12)
        p1.setName('Jack')
        console.log(p1.name, p1.age)
        console.log(p1 instanceof Person)

        function Student(name, price) {
            this.name = name
            this.price = price
        }
        var s = new Student('Bob', 13000)
        console.log(s instanceof Student)

        var p2 = new Person('JACK', 23)
        console.log(p1, p2)
    </script>
</body>

</html>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>05_构造函数+原型的组合模式</title>
</head>

<body>
    <!--
方式六: 构造函数+原型的组合模式
  * 套路: 自定义构造函数, 属性在函数中初始化, 方法添加到原型上
  * 适用场景: 需要创建多个类型确定的对象
-->
    <script type="text/javascript">
        function Person(name, age) { //在构造函数中只初始化一般函数
            this.name = name
            this.age = age
        }
        Person.prototype.setName = function(name) {
            this.name = name
        }

        var p1 = new Person('Tom', 23)
        var p2 = new Person('Jack', 24)
        console.log(p1, p2)
    </script>
</body>

</html>

posted on 2020-02-01 22:53  冲啊!  阅读(145)  评论(0编辑  收藏  举报

导航