javascript对象创建模式

方式一: 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>

方式二: 对象字面量模式

    <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
            }
        }

方式三: 工厂模式

  * 套路: 通过工厂函数动态创建对象并返回

  * 适用场景: 需要创建多个对象

  * 问题: 对象没有一个具体的类型, 都是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>

方式四: 自定义构造函数模式

    <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>
    <script>
        // JavaScript 的构造函数中可以添加一些成员,可以在构造函数本身上添加,也可以在构造函数内部的 this 上添
        // 加。 通过这两种方式添加的成员,就分别称为静态成员和实例成员。
        // 1 静态成员:在构造函数本上添加的成员称为静态成员, 只能由构造函数本身来访问
        // 2 实例成员: 在构造函数内部创建的对象成员称为实例成员, 只能由实例化的对象来访问
        // 构造函数中的属性和方法我们称为成员, 成员可以添加
        function Star(uname, age) {
            this.uname = uname;
            this.age = age;
            this.sing = function() {
                console.log('我会唱歌');
            }
        }
        var ldh = new Star('刘德华', 18);
        // 1.实例成员就是构造函数内部通过this添加的成员 uname age sing 就是实例成员
        // 实例成员只能通过实例化的对象来访问
        console.log(ldh.uname);
        ldh.sing();
        // console.log(Star.uname); // 不可以通过构造函数来访问实例成员
        // 2. 静态成员 在构造函数本身上添加的成员  sex 就是静态成员
        Star.sex = '男';
        // 静态成员只能通过构造函数来访问
        console.log(Star.sex);
        console.log(ldh.sex); // 不能通过对象来访问
    </script>
</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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值