为了账号安全,请及时绑定邮箱和手机立即绑定

求助,关于javascript中的__proto__问题 ,具体如下~

求助,关于javascript中的__proto__问题 ,具体如下~

牛魔王的故事 2022-01-01 11:07:20
function Boo() {}function Foo() {}Foo.prototype = new Boo;p=new Foo;console.log(p.__proto__); //这里为什么输出的是Boo{}呢?不是应该输出Foo{}吗,另外p.__proto__.p.__proto__输出的也是Foo{}另外function Foo() {}p=new Foo;console.log(p.__proto__);这里输出的是Foo{}
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

prototype 是原型,是Function对象才有的属性,原型主要是用来实现继承,从而用js 进行面向对象编程
如 Foo 是一个Function对象,是有prototype属性的 ,它指向一个Boo 的实例对象
而p 是一个 Foo 的实例对象,不是一个Function 对象,没有prototype 属性,但是p有一个私有属性__proto__ 这个属性,一般不直接访问的,事实上这个属性就是 Foo.prototype
在chrome控制台中测试
console.log(p.__proto__ == Foo.prototype)
VM952:2 true
console.log(p.__proto__ === Foo.prototype)
VM956:2 true
上述测试都输出true,说明他们确实是同一个东西

js的继承是通过原型继承的,有个原型链的概念,而原型链就是通过__proto__属性实现的
function Boo() {this.x="test in Boo";}
function Foo() {this.y = "test in Foo"}
Foo.prototype = new Boo;
p=new Foo;
console.log(p.y);//test in Foo

console.log(p.x);//test in Boo
Foo 中并没有属性x,当p找不到属性x时,就到p.__proto__属性(指向原型)中找,原型中是有x属性的,于是输出x的值
如果不考虑内部实现,就好像属性x是从Boo中继承的一样
console.log(p.__proto__); 输出 Boo{}表示一个空的Boo对象(通过 new Boo 创建的 )

p.__proto__.p.__proto__这个会报错,因为p.__proto__中没有名为p的属性

function Foo() {}
p=new Foo;
console.log(p.__proto__);
因为没有改变Foo.prototype 的属性,所以仍然指向它自己(Foo)
而 p.__proto__ 就是 Foo.prototype 所有输出Foo{} 表示一个空的Foo对象



查看完整回答
反对 回复 2022-01-04
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

p.__proto__这个是原型的意思

1.
function Boo() {}
function Foo() {}
Foo.prototype = new Boo; //这里你修改了Foo的原型为Boo,所以下面打印出的是Boo
p=new Foo;
console.log(p.__proto__); //这里为什么输出的是Boo{}呢?不是应该输出Foo{}吗,另外p.__proto__.p.__proto__输出的也是Foo{}

2.
function Foo() {}
p=new Foo;
console.log(p.__proto__);
这里输出的是Foo{}
p是Foo的对象,又没有修改过原型,当然是Foo了

查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 243 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号