首页 > 试题广场 >

以下Javascript代码执行后的输出结果依次是:()

[单选题]
以下Javascript代码执行后的输出结果依次是:()
    ```javascript
    var tmp = {};
    var A = function() {};
    A.prototype = tmp;

    var a = new A();
    A.prototype = {};

    var b = Object.create(tmp);
    b.constructor = A.constructor;

    console.log(a instanceof A);
    console.log(b instanceof A);
    ```
  • true, false
  • false, true
  • true, true
  • false, false
js中的instanceof是判断依据是对象的__proto__是否等于方法/类的prototype
1.首先a instanceof A
在A.prototype = {};这段代码之前,a instanceof A 是返回true的。
但是加上这段代码之后,就是false了,因为复杂的数据类型,{} == {} 返回的false。
所以自然对象的__proto__等于tmp   而方法/类的prototype是{}   上面说了{} == {}返回的是false 
所以第一个返回值是false
2.其次是 b instanceof A
我们要知道Object.create()方法是做什么的   附上链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create
var b = Object.create(tmp); 
这是个时候,b实例的原型就tmp了。
但是别忘了,代码中有个
A.prototype = {};
所以其实和第一个是一样的,{} !={}
所以 第二个返回值也是false

其实,你这要把A.prototype = {};
这行代码去掉,再运行一下,你就会发现返回值全是true了

个人观点,如果有不对的地方,望大神指正。

发表于 2018-12-11 14:20:30 回复(0)
首先要知道a instanceof A是什么意思,他的解释是“a的原型链上是否有A.prototype对象”A必须是一个函数,a必须为一个对象。
在A.prototype={}这句代码之前,a instanceof A为true,但是在这句代码之后,A.protptype被彻底改变。只能说a指向的是旧A.prototype而不是目前新的A.prototype。所以a instanceof A为false,这是第一句的解释。
接着。b instanceof A,这句话就更扯了,要让这句话成立,要么var b=Object.create(A.prototype),要么var b = new A(),
b.constructor = A.constructor这句话毫无影响力,因为JS中的constructor并不代表面向类语言中的构造,以后遇到JS中的这个属性我都选择绕道走,它是非常不可靠的属性。那么b的原型到底是啥呢,是tmp。b instanceof tmp是啥也得不到的因为前面说了instanceof 右操作数必须是个函数,可以使用tmp.isprototypeOf(b)这个方法去验证,结果为true。
编辑于 2019-01-21 18:33:09 回复(0)