原型及原型链


原型及原型链

  • 在你调用一个对象的属性的时, 如果自身的没有此属性, 会默认去其原型去查找, 如果有其他语言的基础, 可能会了解 方法属性的概念

构造函数与类

  • 函数类构造函数的概念, 这两个其实讲的是一个东西 类的构造方法constructor构造函数是同一个东西

  • 如果你是初学者,可以理解为构造函数 这类名词,可以理解为是指定一类事物比如说(人),拥有的 公共属性或方法

  • 比如说人,人都有一些基本的属性,比如说身高,体重, 也会有一些相同的方法, 跑步, 走路, 吃饭。这些都属于人的公共方法, 如果我同时需要创建1000个"人"就需要用{name:"名称"}循环一百次,重复创建方法及属性, 这样会导致很大的问题:内存占用过多, 这个的解决方法就是原型的玩法, 只需要指定公共的方法/属性就可以达到之创建一次就可以重复使用的结果

  • 因为方法可能都一样, 但是人的体重身高可能有差别, 构造函数传入的参数,指定的就是 可变的因素

  • 代码示例

    构造函数

    function Persion(name, age, gender){

    ? this.name = name

    ? this.age = age

    ? this.gender = gender

    class Persion {

    // 构造函数

    ? constructor(a, b) {

    ? this.a = a;

    ? this.b = b;

     }
    

    第一个案例是构造函数的写法, 第二个案例是 class关键字的写法

    里面传入的参数是你每次创建一个对象, 是这个对象的属性

    let kyle = new Persion("kyle", 19, "男")

    console.log(kyle.a);

    console.log(kyle.b)

    console.log(kyle)

原型

这里可以看到默认继承的是Object

  • 如果你有面向对象基础你可以这样理解

    • 原型就是 一个类继承的父类,这个讲的就是类的原型
  • 如果你没有面向对象基础你可以理解为

    • 既然我们说的是Persion类那我以此举例

      function Persion2(name, age, gender){
      	this.name = name
      	this.age = age
      	this.gender = gender
      }
      let kyle = new Persion2("kyle", 19, "男");
      console.log(kyle)
      

      • 这个Prototype就是这个对象的原型, 最早前叫__proto__
      • 可以看到如果没有指定要继承的父类, 默认继承的是 Object

构造函数的Prototype

  • 构造函数的 prototype其实也算是JS内部的优化策略

  • JS会将类中的方法默认存储在其自身的prototype中。 当进行 new 操作的时候会直接赋值给对象的__proto__属性, 这样对象的__proto__属性引用的是构造函数的prototype属性,这样就不存在重复创建。从而达到优化的效果

  • 实例代码

    class Persion {
        constructor(a, b) {
            //  把父级的 constructor 抢过来当做自己的属性来用
            this.a = a;
            this.b = b;
        }
        run() {
            console.log("跑步");
        }
    }
    console.dir(Persion)
    

原型链

  • 在调用一个对象的方法时,如果当前对象内没有此方法, JS会默认去其__proto__中寻找一层层往上查找直到Object__proto__

  • 代码实例

    class Persion {
        constructor(a, b) {
            //  把父级的 constructor 抢过来当做自己的属性来用
            this.a = a;
            this.b = b;
        }
        run() {
            console.log("跑步");
        }
    }
    let kyle = new Persion(1, 2);
    console.log(kyle.a); // 1
    console.log(kyle.b); // 2
    // 这是object原型中的方法, 查看对象是否有`a`属性
    console.log(kyle.hasOwnProperty('a')) // true
    // 这个问题就可以证明他的查找顺序是一层层往父级查找的, 父级没有查询爷爷的属性这就是作用域链
    console.dir(kyle) // 查看对象的原型关系
    

相关