function fn() {
this.a = 0;
this.b = function() {
alert(this.a)
}
}
fn.prototype = {
b: function() {
this.a = 20;
alert(this.a);
},
c: function() {
this.a = 30;
alert(this.a);
}
}
var myfn = new fn();
myfn.b();
myfn.c();
构造函数和原型里面同样有方法b 变量为什么只有在构造函数里面有效?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
因为对象
obj属性查找的规则是:先在对象
obj上查找,找到则直接返回该属性,结束查找在对象的原型
obj.__propo__上查找,找到则直接返回该属性,结束查找在原型的原型(原型链)上查找,找到则直接返回该属性,结束查找
重复第3步,直到原型指向
null,结束查找,返回undefined具体这个问题:
myfn.b在对象属性上找到了,不需要去原型链上查找。变量为什么只有在构造函数里面有效这样理解是不正确的。
题主需要了解到一个概念是,JS在调用方法的时候,会先从实例上寻找该方法,如果没有时,才会往原型上找。
当实例与原型链拥有相同的方法名时,这个时候原型链上的方法是不会被调用到的
myfn.b()实际上是调用了构造函数里的function b原型链上的b并没有被调用到
题主把问题复杂化了。
原型不应该只叫原型,更应该称他为原型链。这里的链是指链表,学过数据结构就明白,链接看起来就是这样子的:
WOC,光看这图我都觉得没有什么可以说的了。
链表彼此之间是通过指针连接,记住是指针、指针、指针。
那么,你的问题在一个链表里面去查找方法b的时候自然是从头一层层的往下找了。找到了,就执行,这说明为什么你的
prototype.b永远不会执行到的原因了。