今天来看看对象取值以及原型指针的修改

366 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

目录

今日题

  1. 题目
  2. 分析 昨日题
  3. 题目
  4. 答案
  5. 解析 结语

今日题

题目

var o1 = {
    info: 'content'
}
var o2 = {
    sex: '女',
    content: '退!退!退!'
}
console.log(o2[o1.info])
o1.__proto__ = o2
console.log(o1.content)

分析

本题考察对象取值的两种方法,一种为.取值,一种为[]取值,两种方法都有着各自的应用场景,我们在平常的使用中大多时候都是前者,但如果对象的key不固定或者是会变化时,那么第二种方式可就大有用处了。其次考察原型指针的修改,昨天的题目是有关于原型链的题,但题目中并未涉及直接修改原型链的操作,所以今天我们一起来看看直接修改原型指针会发生什么,o1.__proto__即直接修改了o1的__proto__属性,读到这里如果还没点赞的小伙伴格外注意了,这个操作是使其指向了o2这个对象,注意是o2这个对象,而不是o2.prototype,或许你也可以将这种关系称之为委托关系,但是在开发中我们并不推荐使用这种方式直接去修改对象的原型指针。

昨日题

题目

function F() {}
var f=new F()
Object.prototype.a='鲨鱼辣椒'
Function.prototype.b='蝎子莱莱'
console.log(f.a)
console.log(f.b)
console.log(F.a)
console.log(F.b)

答案

'鲨鱼辣椒', undefined, '鲨鱼辣椒', '蝎子莱莱'

解析

函数F通过new调用后,F便成为了构造函数,而f也名正言顺地成为了构造函数F的实例对象。此时,f.__proto__ === F.prototypeObject.prototype.a则是为Object的原型对象上添加了一个a属性,Function.prototype.b则是为Function的原型对象上添加了一个b属性,在这里我们需要注意Object与Function的关系为:Function.prototype.__proto__ === Object.prototype,有了这一层关系我们就好办事了。做这道题之前我们先得知道实例对象f身上是没有任何属性的,首先来看f.a,f.__proto__指向F.prototypeF.prototype又指向Object.prototype,因为Object.prototype身上有a属性,所以f.a为鲨鱼辣椒;同理,因为Object.prototype身上没有属性b,所以继续顺着原型链进行查找,Object.prototype__proto__为null,所以f.b为undefined;构造函数F本身上也是没有任何属性的,而又因为所有函数都是大写Function的实例,所以F.__proto__指向Function.prototypeFunction.prototype.__proto__又指向Object.prototype,所以F.a为鲨鱼辣椒。同理,F.b为蝎子莱莱。

结语

此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。
创作不易,少年,就请留个赞再走吧!