Javascript instanceof运算符混淆

Javascript instanceof operator confusion

我读过有关javascript的instanceof操作符的文章,想测试一下。我写了这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
function first() {};
first.prototype.hello = function hello() {
    console.log("hello");
}

var second = {};


second.prototype = Object.create(first.prototype);

console.log(second instanceof first); //should've output true

second.hello();

这不符合我的预期。我在写这篇文章时的想法是:

instanceof将函数(本例中的first作为其右操作数,对象作为其左操作数。然后检查给定函数的原型是否出现在对象原型链的任何部分中。first是函数,hello是添加到first原型中的函数。second的原型被分配了一个新的对象,该对象有一个到first.prototype的原型链接,因此在执行second instanceof first时,它不能直接在second上找到到first.prototype对象的链接,因此它跟随原型链接到具有该链接的second.prototype上。

当我在chrome中运行这个命令时,结果是:

1
2
3
4
false

Uncaught TypeError: second.hello is not a function
  at main.js:13

你能帮我一下吗?


second's prototype is assigned a new object

不,这部分错了。您正在创建一个名为"prototype"的属性,但这并不意味着它是对象的实际原型。

1
2
var second = {};
second.prototype = ...

等于

1
var second = {"prototype": ... };

但这与继承无关。

几乎唯一使用名为"prototype"的属性的地方是构造函数函数(如first上),即使这样,它也不被用作函数本身的原型;它被用作以后从new ThatFunction()创建的任何实例的原型。

你能做的就是

1
2
3
4
5
6
7
8
var second = new first;
// What this does:
//   - gets the object from first.prototype
//   - creates a new derived object, like Object.create(first.prototype)
//   - calls first(), passing the new object as 'this',
//      like first.call(Object.create(first.prototype))
//   - assigns the object returned from first() to second
//      (if first doesn't return an object, it automatically uses the new object created in step 2 instead)

或(大部分相当,但不会称为first)

1
var second = Object.create(first.prototype);


second代替second.prototype

我已经编辑了你的代码。

4


Object.create ()返回需要存储在second变量中而不是second.prototype中的已创建对象。它不返回对象原型,而是返回整个对象本身。

1
2
 var second = {}
 second = Object.create (first.prototype)