上面这道是考察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:
小结写了好几天,之前网上很多图文博客,那些线指来指去,就我个人看来还是比较难以理解的,所以本文纯文字的形式来描述这些概念,相信认真看完的同学肯定都有所收获,如果没看懂的话,建议多看几遍,这部分概念真的很重要!
PS:实际上还有很多引申出来的东西没写全,准备放到其他文章中去写。
觉得我的博客对你有帮助的话,就给我点个Star吧!前端进阶积累、公众号、GitHub、wx:OBkoro1、邮箱:obkoro1@foxmail.com
以上2019/8/25