由三道题引伸出来的思考
题目 这是在刷题遇到的题目,当时没有做对。有一些知识点没有弄懂,所以记下来,在学一下,也顺便分享到掘金,希望能帮助到别人(骗波赞)。【建议阅读时长:5min】
第一道
var a = {
n: 1
}
a.x = a = {
n: 2
}
console.log(a.x)
复制代码
第二道
Object.prototype.a = 1
Function.prototype.a = 2function Foo() {}
var ins = new Foo()
console.log(ins.a)
复制代码
第三道
var a = 'outer'
var obj = {
a: 'inner',
fn: function() {
console.log(this.a)
}
}
var wyqn = obj.fn
wyqn()
复制代码
- undefined
- 1
- outer
===========================================
===========================================
解析 第一道
等号先执行右边在等于左边
- a.x = a = {n:2} 等价于 a.x = ( a = { n : 2} )
- 得到 a.x = { n : 2 },左边第一个等号的计算结束
- 然后计算括号内的表达式 a = { n: 2}
- a 指向新的对象,{n:2},所以 a.x等于 undefined。 等价于
var a = {n:1}
var a1 = {n:2}
a.x = a1,
a = a1
console.log(a.x);
复制代码
===========================================
第二道
先说点题外话,我们都知道: 函数也是对象,只不过是具有特殊功能的对象而已。任何函数都可以看成是通过 Function() 构造函数的new操作实例化的结果。
构建出来的函数 Foo,指向 Function.prototype 如果把函数 Foo 当成实例对象,其构造函数是 Function() ,其原型对象是 Foo.prototype == Function.prototype;
如果把 Function 作为实例对象的话,其原型对象是什么呢? 等同于上面的理解,可以看成是 Object() 构造函数的 new 操作的实例化结果,所以其原型对象是 Object.prototype.
当你执行
var ins = new Foo();
复制代码
实际上内部执行的是
var ins = new Object();
ins.__proto__ = Foo.prototype;
Foo.call(ins);
复制代码
Object.getPrototypeOf(ins).a == Foo.prototype.a。【补充:实际上当执行ins.a相当于执行Object.getPrototypeOf(ins).a.call(ins)==Foo.prototype.a.call(ins)】
它检查 ins 是否具有 a 属性。如果没有,它会查找 Object.getPrototypeOf(ins).a,如果仍旧没有,它会继续查找 Object.getPrototypeOf(Object.getPrototypeOf(ins)).a。
补充材料:mdn关于继承与原型链
【由三道题引伸出来的思考】===========================================
第三道
js里面有三种调用
func(p1, p2)
obj.child.method(p1, p2)
func.call(context, p1, p2)复制代码
以上三种形式,我们可能常用的会是上面两种,第三种不常用。可是第三种才是我们应该会的,其他两种只是语法糖而已。
func(p1, p2)
等价于
func.call(undefined, p1, p2)
复制代码
obj.child.method(p1, p2)
等价于
obj.child.method.call(obj.method, p1, p2)
复制代码
我们再来理解下: wyqn() 可以看成 wyqn.call(), 由于没有传 context.所以 this 就是 undefined。
最后浏览器会给你一个默认的 this -- window 对象。
总结 javascript常考的点都在这三道题体现出来了,里面涉及到的一些知识点可能没有提。 包括我自己可能理解有误的地方,欢迎指出。希望能一起进步,成长。
推荐阅读
- parallels|parallels desktop 解决网络初始化失败问题
- jhipster|jhipster 升级无效问题
- 由浅入深理解AOP
- “精神病患者”的角度问题
- 画解算法(1.|画解算法:1. 两数之和)
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 28岁|28岁,做一个通透又自由的姑娘。
- 解决SpringBoot引用别的模块无法注入的问题
- leetcode|leetcode 92. 反转链表 II
- 迷茫是人生常态