JS从0开始(十)原型、原型链

294 阅读2分钟

一. 原型

1.构造函数的属性 原型对象:prototype

<script>
function Handphone(){

}
console.log(Handphone.prototype); /{constructor : f}

/原型prototype 其实就是function对象的一个属性
/打印出来看一下,其实它也是对象
</script>

1.prototype属于 构造函数 的属性
2.所有被同一个构造函数构造出来的对象都可以继承原型prototype上的属性和方法

1.2 this上面已有的属性不会往原型上面找

this上面已有的属性不会往原型上面找:

1.3 写死的属性和方法放到原型里面去

当我们需要参数传值的时候一般写在this中,需要写死的东西放到原型里面去

往往属性都是要传参的,而方法基本上都是不变的,所以一般方法都放到原型里面去:

2. 构造器 constructor

打印 构造函数的原型 时出现constructor : 构造器 1 constructor属于构造函数的prototype中,指向的是构造函数本身。

2 constructor可以被更改

 function A() { }
        function Car(name, age) {
            this.name = name;
            this.age = age;
        }
        Car.prototype.constructor = A;
        console.log(Car.prototype); /输出constructor: ƒ A()

3. 对象原型__proto__

1.__proto__是在实例化对象时生成的一个属性,存放于this中。

2.__proto__属于实例化对象
3.__proto__是每个实例化对象的原型prototype的容器,通过__proto__访问prototype简而言之:__proto__里面存储了prototype

当构造函数被new的时候产生了一个 this{} 对象,这个this其实不是空对象,里边默认有个__proto__ , __proto__里面默认装上了实例化对象以后的原型 prototype:

这样就证明了 __proto__一定是属于实例化对象的,而不属于构造函数

本节课知识 及相关案例

1.

<script>
 function Car(){}
   var car = new Car();
    Car.prototype.name = "Benz"
   console.log(car.name);
     Car.prototype.name = "Mazda"
   console.log(car.name);
</script>

输出Benz、Mazda

2.

 <script>
        function Car() { }
        Car.prototype.name = "Benz"
        var car = new Car();

       Car.prototype = {
           name:'Mazda'
       }
       
        console.log(car.name);
    </script>

输出 Benz :
解析:因为此时实例化时产生_proto_ 将Benz 存入到car 里面去。
而之后的 Mazda 只是存进了构造函数Car()里面
并不能改变实例化对象 car 中的值

知识点:1.被实例化时:prototype被存到__proto__属性中
2.constructor指向的是构造函数本身, 因为构造函数变化了,所以此时constructor也会变化,里面保存的name为Mazda

同时:

        function Car() { }
        Car.prototype.name = "Benz"
        var car = new Car();
        Car.prototype.name = "mmm"
        console.log(car.name);   /输出mmm

这种情况是给实例化对象中的 prototype.name 属性赋值,即:

这种是直接改变实例化对象的值,而之前是直接改变构造函数的值

3. 用window 实现闭包

 <script>
      function test() {
          var a = 1;
          function add(){
              a++;
              console.log(a);
          }
          window.abb = add; /将函数存到全局的abb变量里面
      }
    test();
    abb();
    abb();
    abb();
    </script>

输出2 3 4 ,将函数 存到全局里面

实战

写一个插件 任意传两个数字,调用插件内部方法可进行加减乘除功能