JS高级学习总结(对象)

1.对象基础

1.1 什么是对象?

  • 多个数据的封装体
  • 用来保存多个数据的容器
  • 一个对象代表现实中的一个事物

1.2 为什么要用对象?

  • 统一管理多个数据

1.3 对象的组成?

  • 属性:属性名(字符串)和属性值(任意)组成,代表现实事物的状态数据
  • 方法:一种特别的属性(属性值是函数),代表现实事物的行为数据

1.4 如何访问对象内部数据?

  • . 属性名:编码简单,有时不能用
  • [ ’ 属性名 ’ ]:编码麻烦,能通用
<script type="text/javascript">
     var p = {
         name:'Tom',
         age :12,
         setName:function(name) {
             this.name = name         
         },    
         setAge:function(age){
             this.age = age         
         }
     }
     
     p.setName('Bob')
     p['setAge'](23)
     console.log(p.name,p['age'])  // Bob 23
</script>

1.5 相关问题:

问:什么时候必须使用[ ’ 属性名 ’ ]的方式?

  • 属性名包含特殊字符:- 空格
  • 属性名不确定
<script type="text/javascript">
    var  p = {}
    //1.给p对象添加一个属性:content type: text/json
    //p.content-type = 'text/json' // 不能用
    p['content-type'] = 'text/json'
    console.log(p['content-type'])
    //2.变量名不确定
    var propName = 'myAge'
    var value = 18
    //p.propName = value //不能用
    p[propName] = value
    console.log(p[propName])
</script>

2.对象高级

2.1 对象创建模式

2.1.1 对象创建方式一:Object构造函数模式
  • 先创建空的Object对象,再动态添加属性/方法
  • 适用场景:起始时不确定对象内部数据
  • 问题:语句太多
<script>
    var p = new Object()
    p.name = 'Tom'
    p.age = 12
    p.setName = function (name) {
        this.name = name    
    }
    console.log(p)
</script>
2.1.2 对象创建方式二:对象字面量模式
  • 使用{ }创建对象,同时指定属性/方法
  • 适用场景:起始时对象内部数据是确定的
  • 问题:如果创建多个对象,有重复代码
<script>
    var p = {
        name: 'Tom'
        age: 12,
        setName: function (name) {
            this.name = name        
        }            
    }
</script>
2.1.3 对象创建方式三:工厂模式
  • 通过工厂函数动态创建对象并返回
  • 适用场景:需要创建多个对象
  • 问题:对象没有具体类型,都是Object类型
<script>
    function creatPerson (name,age) {    //返回一个对象的函数===>工厂函数
        var obj = {
            name: name,
            age: age,
            setName: function(name){
                this.name = name            
            }                    
        }   
        return obj 
    }
    var p1 = creatPerson('Tom',12)
    var p3 = creatPerson('Jack',32)
</script>
2.1.4 对象创建方式四:自定义构造函数模式
  • 自定义构造函数,通过new创建对象
  • 适用场景:需要创建多个类型确定的对象
  • 每个对象都有相同的数据,浪费内存
<script>
    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)
</script>
2.1.5 对象创建方式五:构造函数+原型的组合模式
  • 自定义构造函数,属性在函数中初始化,方法添加到原型上
  • 适用场景:需要创建多个类型确定的对象
<script>
    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',12)
    console.log(p1,p2)
</script>

2.2 继承模式

2.2.1 继承模式方式一:原型链继承
  • 1.套路
    • 定义父类型构造函数
    • 给父类型的原型添加方法
    • 定义子类型的构造函数
    • 创建父类型的对象赋值给子类型的原型
    • 将子类型原型的构造属性设置为子类型
    • 给子类型原型添加方法
    • 创建子类型的对象:可以调用父类型的方法
  • 2.关键
    • 子类型的原型为父类型的一个实例对象
      在这里插入图片描述
2.2.2 继承模式方式二:借用构造函数继承(假的)
  • 1.套路
    • 定义父类型构造函数
    • 定义子类型的构造函数
    • 在子类型构造函数中调用父类型构造
  • 2.关键
    • 在子类型构造函数中通过super()调用父类型构造函数
<script>
    function Person(name, age){
        this.name = name
        this.age = age        
    }
     function Student(name, age, price){
         Person.call(this,name,age)   //相对于this.person(name,age)
         //this.name = name
         //this.age = age      
         this.price = price
    }
    var s = new Student('Bob',20,13000)
    console.log(s.name,s.age,s.price)
</script>
2.2.3 继承模式方式三:原型链+借用构造函数的组合继承
  • 1.利用原型链实现对父类型对象的方法继承
  • 2.利用super()借用父类型构建函数初始化相同属性
<script>
     function Person(name, age){
        this.name = name
        this.age = age        
    }
     Person.prototype.setName = function (name){
        this.name = name    
    }
    function Student (name,age,price) {
        Person.call(this,name,age)   // 为了得到属性
        this.price = price    
    }
    Student.prototype = new Person()  // 为了能看到父类型的方法
    Student.prototype.constructor = Student  // 修正constructor属性
    Student.prototype.setPrice = function (price){
        this.price = price    
    }
    var s = new Student('Tom',20,13000)
    s.setName('Bob')
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值