码迷,mamicode.com
首页 > 其他好文 > 详细

浅谈给原型重新赋值问题

时间:2020-01-17 20:37:47      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:理解   ima   div   img   fine   some   nbsp   alert   mamicode   

也许,你曾碰到过这样一个问题:我原型里面有某个属性,但是为什么是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.
    技术图片

     

     

浅谈给原型重新赋值问题

标签:理解   ima   div   img   fine   some   nbsp   alert   mamicode   

原文地址:https://www.cnblogs.com/hanlinbaiyu/p/12207161.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!