JavaScript笔记-面向对象编程(3)对象原型与原型对象

   console.log(Star.prototype.constructor);
   console.log(ldh.__proto__.constructor);
   //打印的是一样的 都是Star这个函数本身 对象原型或者原型对象.constructor都指向构造函数

Prototype本身就是一个对象 一个自带的内置的对象 这就是为什么它被叫做原型对象

 function Star(uname, age) {
         this.uname = uname;
         this.age = age;
     }
     Star.prototype = {
         //这是在创建对象 不懂的话看文档最最开始 3种创建对象的方法之一 这是字面量方法
         //以后记住看到后面跟花括号 就是创建对象!
         //Star.protype本身就是一个对象别忘了 因为prototype自身就是一个对象属性 是自带的 内置的
         //那么这一段代码其实进行了一个赋值操作 也就是说利用了后面的sing和movie将这个prototype对象给覆盖掉了
         // 覆盖完了以后就没有star.constructor 这个属性了

         sing: function () {
             console.log('我能唱歌');

         },
         movie: function () {
             console.log('我能演电影');

         }

     }
     console.log(Star.prototype);//输出结果为sing movie两个function 理由很简单 赋值覆盖掉了呗


     function Star(uname, age) {
         this.uname = uname;
         this.age = age;
     }
     Star.prototype = {
         //这是在创建对象 不懂的话看文档最最开始 3种创建对象的方法之一 这是字面量方法
         //以后记住看到后面跟花括号 就是创建对象!
         //Star.protype本身就是一个对象别忘了 因为prototype自身就是一个对象属性 是自带的 内置的
         //概括来说就是 如果我们修改了原来的原型对象,给原型对象等于了一个花括号 也就是说通过赋值覆盖了这个原型对象 我们需要手动指回原来的构造函数 方法就是在赋值覆盖的时候写constructor:Star(不一定是Star 冒号后面跟构造函数名称)
         //那么这一段代码其实进行了一个赋值操作 也就是说利用了后面的sing和movie将这个prototype对象给覆盖掉了
         // 覆盖完了以后就没有star.constructor 这个属性了
         constructor: Star,
         //添加上面这一行的代码之后
         //就相当于手动指回原来的构造函数(那个uname age)
         //console.log(Star.protype.constructor) 返回Star这个原来的构造函数

总结一下,在我们的原型prototype里面 有一个属性叫constructor ,这个constructor(找爹仪器 找爹探头)可以告诉我们你这个原型对象(儿子)是通过哪个构造函数(爹)创建出来的。当原型对象(儿子)被你做了对象的赋值操作 /覆盖之后,那原来的constructor属性就被覆盖掉了 (就没了)要让原型对象(儿子)重新找到构造函数(爹) 需要我们手动指回,方法是在赋值覆盖的花括号里面写constructor:Star(爹的名字)

你可能感兴趣的:(javascript,前端)