JS基础-该如何理解原型、原型链? (3)

上面这道是考察JS基础的题,很多人都没说对,原因是没有彻底掌握this、原型链、函数。

想一下再看解析: 想一下再看解析: 想一下再看解析: 想一下再看解析: 想一下再看解析:

this.some:foo1对象的属性

通过构造调用foo的this指向foo1,所以this.some挂载在foo1对象下。

属性查找: foo1.some

foo1.some直接读取foo1的属性。

foo1.test、foo1.a:foo1对象的原型

根据上文提到的:构造/new调用函数的时候会创建一个新对象(foo1),自动将foo1的原型(Object.getPrototypeOf(foo1))指向构造函数的prototype对象。

构造调用会执行函数,所以foo.prototype.a = 'aaaaa'也会执行,单就赋值这个层面来说写在foo外面和写在foo里面是一样的。

属性查找:foo1.test、foo1.a

foo1本身没有找到,继续查找

foo1的原型Object.getPrototypeOf(foo1)上找到了a和test,返回它们,停止查找。

foo1.obkoro1和foo1.koro:返回undefined

静态属性: foo.obkoro1、foo.koro

函数在JS中是一等公民,它也是一个对象, 用来模拟类。

这两个属性跟foo1没有关系,它是对象foo上的两个属性(类似函数的:arguments/prototype/length等属性),称为静态属性

它们只能通过foo.obkoro1和foo.koro来访问。

原型对象改变,原型链下游获取的值也会改变

上面那个例子中的foo1.test的值是什么?

foo.prototype.test = 'test' let foo1 = new foo() // `foo1`上有哪些属性,这些属性分别挂载在哪个地方 foo.prototype.test = 'test2' // 重新赋值

foo1.test的值是test2,原因是:foo1的原型对象是Object.getPrototypeOf(foo1)存的指针,指向foo.prototype的内存地址,不是拷贝,每次读取的值都是当前foo.prototype的最新值。

打印foo1

JS基础-该如何理解原型、原型链?

小结

写了好几天,之前网上很多图文博客,那些线指来指去,就我个人看来还是比较难以理解的,所以本文纯文字的形式来描述这些概念,相信认真看完的同学肯定都有所收获,如果没看懂的话,建议多看几遍,这部分概念真的很重要!

PS:实际上还有很多引申出来的东西没写全,准备放到其他文章中去写。

觉得我的博客对你有帮助的话,就给我点个Star吧!

前端进阶积累、公众号、GitHub、wx:OBkoro1、邮箱:obkoro1@foxmail.com

以上2019/8/25

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpywdd.html