浅谈给原型重新赋值问题
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.
以上是关于浅谈给原型重新赋值问题的主要内容,如果未能解决你的问题,请参考以下文章