javascript理解篇42——原型对象prototype、对象原型__proto__、原型链

一、原型对象prototype、对象原型__proto__

代码:

 function TV(uname, uyear) {
    
    
     this.uname = uname;
      this.uyear = uyear;
  }
  //利用构造函数创建对象,new 一下TV 构造函数创建clj实例对象 
  var clj = new TV('《苍兰诀》', 2022);
  TV.prototype.sing = function() {
    
    
      console.log("歌曲要收费");
  };
  TV.prototype.actor = function() {
    
    
      console.log("新人演员");
  };

  // console.dir(obj3.__proto__ === TV.prototype); //true 对象原型===原型对象
  console.log(TV.prototype); 
  console.log(clj.__proto__); 

  console.log(TV.prototype.constructor); 
  console.log(clj.__proto__.constructor); 

结果:
在这里插入图片描述

二、

代码:

 // 抽取对象的公共部分做成一个模板 
 function TV(uname, uyear) {
    
    
      this.uname = uname;
      this.uyear = uyear;
  }
  //利用构造函数创建对象,new 一下TV 构造函数创建clj实例对象 
  var clj = new TV('《苍兰诀》', 2022);
  //1.这种属于直接给的对象添加方法,并不需要其他修改
  // TV.prototype.sing = function() {
    
    
  //     console.log("歌曲要收费");
  // };
  // TV.prototype.actor = function() {
    
    
  //     console.log("新人演员");
  // };
  // 2.采用对象的形式进行存储方法,
  // 这种情况相当于修改了原来的原型对象,给原型对象赋了一个对象,
  // 这种必须手动修改constructor指回原来的构造函数
  TV.prototype = {
    
    
      constructor: TV, //手动指回
      sing: function() {
    
    
          console.log("歌曲要收费");
      },
      actor: function() {
    
    
          console.log("新人演员");
      }
  };
  // console.dir(obj3.__proto__ === TV.prototype); //true 对象原型===原型对象
  console.log(TV.prototype);
  console.log(clj.__proto__);

  console.log(TV.prototype.constructor);
  console.log(clj.__proto__.constructor);

结果:
在这里插入图片描述

三、上述总结

1.区别

TV.prototype.sing = function(){
    
    }

TV.prototype = {
    
    
      sing : function(){
    
    }
}

这两种写法是不一样的,前者是添加,后着是重新赋值。

2.构造函数、实例、原型对象三者关系

在这里插入图片描述

四、整理黑马

原型链

在这里插入图片描述
在这里插入图片描述
Object是顶层了,再往上就找不到原型了。
原型链为查找对象成员(属性或方法)提供了一条路,可以一路往上找,找到就返回找到的(属性或方法),最后找不到就返回undefined。
在这里插入图片描述
案例演示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xulihua_75/article/details/126660306