微语:代码适合中午敲,早晚出BUG
写出下面Console.log的结果 面试题
var foo = {},F = function () {}
Object.prototype.a = 'value a'
Function.prototype.b = 'value b'
console.log(foo.a) //结果 === value a
console.log(foo.b) //结果 === undefined
console.log(F.a) //结果 === value a
console.log(F.b) //结果 === value b
流程:
-
这段代码展示了 JavaScript 中的原型链的工作原理。在代码执行过程中,首先创建了一个名为
foo的空对象,然后定义了一个名为F的函数。 -
接下来,通过给
Object.prototype添加属性a,以及给Function.prototype添加属性b,这些属性会被继承到foo对象和F函数上。 -
当我们尝试打印
foo.a时,由于foo对象本身没有a属性,JavaScript 会沿着原型链向上查找,最终找到了Object.prototype上的a属性,因此打印结果是value a。 -
而对于
foo.b,由于foo对象和Foo函数本身都没有b属性,于是 JavaScript 会继续向上查找,找到了Function.prototype上的b属性,因此打印结果是undefined。 -
对于
F.a,由于F是一个函数,它本身不会继承Object.prototype上的属性,但是由于 JavaScript 中的函数也是对象,所以它可以访问到Object.prototype上的属性。因此打印结果是value a。 -
最后,对于
F.b,由于F函数本身没有b属性,JavaScript 会继续向上查找,找到了Function.prototype上的b属性,因此打印结果是value b。