由三道题引伸出来的思考
题目
第一道
第二道
第三道
1.undefined 2.1 3.outer
1.考察等号的赋值 2.考察原型的理解 3.考察 this 的理解
===========================================
===========================================
解析
解析第一道
等号先执行右边在等于左边 1.a.x = a = {n:2} 等价于 a.x = ( a = { n : 2} ) 2.得到 a.x = { n : 2 },左边第一个等号的计算结束 4.然后计算括号内的表达式 a = { n: 2} 5.a指向新的对象,{n:2},所以a.x等于undefine。 等价于
===========================================
解析第二道
先说点题外话,我们都知道: 函数也是对象,只不过是具有特殊功能的对象而已。任何函数都可以看成是通过Function()构造函数的new操作实例化的结果。
构建出来的函数Foo,指向Function.prototype 如果把函数Foo当成实例对象,其构造函数是Function(),其原型对象是Foo.prototype == Function.prototype;
如果把Function作为实例对象的话,其原型对象是什么呢? 等同于上面的理解,可以看成是Object()构造函数的new操作的实例化结果,所以其原型对象是Object.prototype.
当你执行
实际上内部执行的是
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里面有三种调用
以上三种形式,我们可能常用的会是上面两种,第三种不常用。可是第三种才是我们应该会的,其他两种只是语法糖而已。
我们再来理解下: wyqn()可以看成wyqn.call() 由于没有传 context 所以this 就是 undefined 最后浏览器会给你一个默认的this--window对象
总结
javascript常考的点都在这三道题体现出来了,里面涉及到的一些知识点可能没有提。 包括我自己可能理解有误的地方,欢迎指出。希望能一起进步,成长。
最后更新于
这有帮助吗?