面向对象

构造函数的使用

  1. 构造函数和普通函数没有区别, 只不过在调用的时候 和 new 关键字连用
  2. 书写构造函数, 函数名首字母大写, 当看到名字的时候,就知道要和 new关键字连用
  3. 调用的时候,需要和 new 关键字连用
    1. 只有和 new关键字连用的时候,这个函数才会自动创建和返回对象的能力
    2. 我们之所以书写构造函数,就是为了使用它去批量生产对象
    3. 如果不和 new 关键字连用,那么该函数没有创建对象的能力,没有自动返回对象的能力
  4. 调用构造函数的时候,如果不需要传递参数,
    1. 可以不写最后的小括号
    2. 如果你需要传递参数,那么必须写小口号
    3. 但是书写规范,我们都写上小括号
  5. 当你的函数名和 new 关键字连用的时候
    1. 函数内部的 this 只想 当前实例(new 关键字前面的变量)
    2. 我们直接在函数体内书写 this.xxx = 值
  6. 构造函数内部不要写 retur
    1. 当你 return 了一个基本数据类型的时候,写了白写
    2. 当你 return 了一个复杂数据类型的时候,构造函数写了白写
<script>
    function Persion(){
        this.name = "aaaa"
        return "11111"  //  return无效
    }
    function Persion1(){
        this.name = "aaaa"  //  构造函数无效
        return [1, 2, 3]  
    }
</script>

构造函数的不合理

  1. 当你在构造函数体内书写方法的时候,你需要想对象上添加方法的时候,只要创建一次对象(new xxx)就会有一个函数占用空间,创建100次就会有 100个一摸一样的函数出现,但这里面有99个是重复的

原型prototype

  1. 定义:每一个函数天生自带一个属性,叫做 prototype,是一个对象
  2. 构造函数也是函数,也会有这个自带的空间 prototype
  3. 既然 prototype是一个对象,我们就可以使用对象操作的语法, 向里面添加一些内容

   定义: 每一个对象,在访问他的成员的时候,如果自己没有这个属性,会自动去所属构造函数的 prototype上查找

/*
    1. 实例对象上的 __proto__指向谁?
        指向所属构造函数的 prototype
        p1所属的构造函数时 Person
        p1.__proto__指向 Person.prototype
    2. Person.prototype 的__proto__ 指向谁?
        Person.prototype 所属的构造函数是谁?
        Person.prototype 时一个对象数据类型(Object)
        在 JS 内所有的 object 数据类型都时属于 object 这个内饰构造函数的
        Person.prototype 时属于 Object 这个内置构造函数的
        Person.prototype 的 __proto__ 指向 object.prototype
    3. Person 的 __proto__指向谁?
        Person 是一个函数,函数本身也是一个对象,就会有 __proto__
        在 js 内, 所有的函数都是属于内置构造函数 Function的实例
        Person.__proto__指向 Function.prototype
    4. Object.prototype 的 __proto__ 指向谁?
        Object.prototype 事一个对象树类型, 只要事对象, 都是数据 object 这个内置构造函数的
        # 注意: Object.prototype 在 JS 内叫做顶级原型,不存在 __prototype__ 了
         所以 Object.prototype 的 __proto__指向 null
    5. Object的__proto__指向谁?
        Object 是一个内置构造函数,同事也是一个函数, 同时也是一个对象
        在 JS 内, 所有的 函数都是属于内置构造函数 Function的实例
        Object 也是 Function的实例
        Object.__proto__指向Function.prototype
    6.Function.prototype 的 __proto__指向谁?
        Function.prototype 也是夜歌对象数据类型
        只要是对象数据类型都是 Object的实例
        Function.prototype 的 __proto__指向 object.prototype
    7. Function 的__proto__指向谁?
        Function 也是一个内置构造函数, 也是一个函数
        在 JS 内, 所有的函数都是属于内置构造函数 Function的实例
        Function 自己是自己的构造函数
        Function 自己是自己的实例对象
        Function 所属的构造函数的时 Function
        
    原型链
        用 __proto__ 出啊年起来的对象链状结构
        注意: 使用 __proto__
        每一个对象数据类型, 都有一个属于自己的原型链
        作用: 为了访问对象成员
        
    对象访问机制:
        当你需要访问兑现的成员的时候
        首先在自己身上查找, 如果有直接使用
        如果没有, 会自动去 __proto__ 上查找
        如果还没有, 就再去 __proto__ 上查找
        知道 object.prototype 都没有,那么返回 undefined
*/
function Persion(){}
Persion.prototype.a = 100
Persion.prototype.b = 200
var p1 = new Persion()
console.log(p.__prto__ === Persion.prototype)

当你访问 p的 a成员的时候,自己没有,会走动去自己的__proto__上查找,又因为自己的 __proto__就是Person.prototype,所以,其实就是去到Person.prototype上查找

自定义构造函数创建的对象也是对象,当你访问某一个成员的时候,如果没有,也会自动去所属构造函数的原型上查找

哪一个构造函数创建的对象,这个对象就属于哪一个构造函数

因为构造函数在创建对象的过程,我们起名未 实例化的过程,创建出来的对象叫做这个函数的一个实例化对象

posted @ 2023-03-04 16:17  JiZhaoG  阅读(19)  评论(0)    收藏  举报