浅谈给原型重新赋值问题

Posted hanlinbaiyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈给原型重新赋值问题相关的知识,希望对你有一定的参考价值。

也许,你曾碰到过这样一个问题:我原型里面有某个属性,但是为什么是undefined呢?

例如以下代码:

function Person(){}

var man = new Person();

Person.prototype={
    name: "Tom",
    age: 18,
    saySomething: function(){
        alert("hello!");
    }
};
console.log(man.name); //undefined

 看到这里,是不是有点困惑了?

 其实要理解这个,需要明白以下三点:

  • Person的prototype属性是何时产生的?
  • 实例对象man与prototype是什么关系?
  • 对象的引用

下面来逐个回答下:

  • 创建构造函数的时候,会自动生成prototype属性,指向一个对象

    也就是说function Person(){}执行完毕的时候,就已经存在prototype属性了,且指向一个对象
  • new实例对象的时候,会生成__proto__属性,指向构造函数的原型
       代码在执行console.log(man.name)的时候,会先查找man对象上是否有name属性,若是没有找到该属性,会通过__proto__属性查找构造函数Person的原型

  • function Person(){}
    
    var man = new Person();

    代码执行到此,构造函数Person的prototype属性指向的对象和实例对象man的__proto__指向的对象都是
    技术图片

     

     接着执行代码:

      
    Person.prototype={
        name: "Tom",
        age: 18,
        saySomething: function(){
            alert("hello!");
        }
    };
     
    Person.prototype指向了另一个对象,即下图所示:

    技术图片

     

     

    但是实例对象man的__proto__指向没有改变,即下图所示。所以man的原型链上没有name属性,所以undefined.
    技术图片

     

     

以上是关于浅谈给原型重新赋值问题的主要内容,如果未能解决你的问题,请参考以下文章

架构师内功心法,只是单纯听说过的原型模式详解

架构师内功心法,只是单纯听说过的原型模式详解

浅谈JavaScript原型链

浅谈JavaScriptES5ES6

浅谈JavaScriptES5ES6

javascript 原型