CalebCai

学习笔记(一) 关于原型与原型链的理解

  • 原型是什么
  1. 原型是一个对象
  2. 原型是共享的方法

构造函数与原型:

假设我们在这么一个构造函数中,我们每实例化一个对象,他就会给我们的方法(sing)在去开辟一块新的内存空间,那么我们要解决这个问题最好的方式就是将公共的方法定义在原型对象上,将公共的属性定义在构造函数之中,以此来避免造成内存的浪费。

function start(name,age){

  this.name = name;

  this.age = age;
    
   this.sing = function(){

      console.log('唱歌');
}
        
}
function start(name,age){
  this.name = name;
  this.age = age;
  start.prototype.sing = function(){
   console.log('唱歌'); 
 }
}
var ldh = new Star('刘德华', 18);
var zxy = new Star('张学友', 19);
ldh.sing();

 这样我们就在构造函数的原型对象上定义了我们的sing方法;

那接下来,为什么实例后的对象能够使用sing方法呢,因为每个实例后的对象都有一个__poroto__属性,他指向了我们的构造函数的原型对象上,所以能够使用构造函数原型对象上的方法。

方法查找规则:

首先看ldh看看这个实例对象上有没有相应的方法,因为有__proto__的存在则通过__proto__属性去构造函数的原型对象prototype上看是否有对应的方法,如果还没有则在通过__proto__到Object的原型对象prototype上查询是否有对应的方法存在,如果再没有则返回null;

这里推荐采用再原型对象.的方式追加方法,我们知道我们的原型对象是一个对象,要是直接对其进行赋值,会将原来的给覆盖了,这样原来的constructor指向其对应的构造函数也被覆盖了,所以我们要收手动的将其指回构造函数

function Star(uname, age) {
            this.uname = uname;
            this.age = age;
        }
        // 很多情况下,我们需要手动的利用constructor 这个属性指回 原来的构造函数
        // Star.prototype.sing = function() {
        //     console.log('我会唱歌');
        // };
        // Star.prototype.movie = function() {
        //     console.log('我会演电影');
        // }
        Star.prototype = {
            // 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
            constructor: Star,
            sing: function() {
                console.log('我会唱歌');
            },
            movie: function() {
                console.log('我会演电影');
            }
        }

 原型链:

以上述方法为例:将其用图的方式表示原型链

 

 

 

 

 这是原型链

 

posted on 2020-10-21 17:28  CalebCai  阅读(77)  评论(0)    收藏  举报

导航