2022.1.16日学习(JavaScript)

124 阅读2分钟

1. 构造函数和原型

1.1 构造函数

new 在执行时会做四件事情:

  • 在内存中创建一个新的空对象
  • 让 this 指向这个新的对象
  • 执行构造函数里面的代码,给这个新对象添加属性和方法
  • 返回这个新对象(所以构造函数里面不需要 return)

image-20220116144722539.png

1.2 成员

  • 静态成员:在构造函数上添加的成员称为静态成员,只能通过构造函数本身来访问

    function Star (name, age) {
              this.name = name;
              this.age = age;
              this.sing = function(){
                console.log('我会唱歌');
              }
          }
    ​
    let ldh = new Star('刘德华', 13);
    alert(ldh.name); // 刘德华
    alert(Star.name); // underfined
    
  • 实例成员:在构造函数内部创建的对象称为实力成员,只能由实例化的对象来访问

function Star (name, age) {
          this.name = name;
          this.age = age;
          this.sing = function(){
            console.log('我会唱歌');
          }
      }
​
let ldh = new Star('刘德华', 13);
alert(ldh.name); // underfined
alert(Star.name); // 刘德华

1.3 构造函数的问题

构造函数方法虽然好用,但是存在浪费内存的问题

image-20220116145807394.png

1.4 构造函数原型 prototype

构造函数上定义的函数是所有对象共享的

JavaScript 规定每一个对象都会有一个 prototype 属性,我们可以把那些不变的方法,直接定义在 prototype 对象上,

这样所有的对象实例都可以共享一个方法

function Star (name, age) {
          this.name = name;
          this.age = age;
          // 错误写法
          //this.sing = function () {
          //    console.log('我会唱歌')
          //}
      }
      // 正确写法
      Star.prototype.sing = function() {
        console.log('我会唱歌');
      }

1.5 对象原型 _proto_

每一个对象都会有一个属性_proto_指向构造函数的 prototype 原型对象,之所以我们对象能够使用构造函数 prototype 原型对象的属性和方法,就是因为_proto_的存在

  • _proto_对象原型和原型对象 prototype 等价
  • _proto_指向对象的 prototype

image-20220116151251550.png

1.6 对象的 constructor 属性

主要是告诉我们这个对象是由哪一个构造函数创建出来的

      function Star (name, age) {
          this.name = name;
          this.age = age;
      }
    
      let ldh = new Star('刘德华', 13);
      console.log(ldh._proto_.constructor); // Star

1.7 构造函数、实例、原型对象三者的关系

image-20220116153232790.png

1.8 原型链

image-20220116153532457.png

1.9 JavaScript 的成员查找机制(规则)

  • 当访问一个对象的属性(方法),会首先看这个对象自身是否具有这个属性
  • 如果没有就查找他的原型(__proto__指向的 prototype原型对象)
  • 如果还没有就查找原型对象的原型(Object的原型对象)
  • 依此类推一直找到 Object为止(null)

1.10 this 指向问题

  • this 指向调用者