操作员混淆的Javascript实例

时间:2018-09-04 05:05:56

标签: javascript

我已经了解了Javascript的instanceof运算符,并想对其进行测试。我已经编写了这段代码:

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时,它找不到{{1}上的first.prototype对象的链接},因此它会跟随原型链接到达具有该链接的second

当我在Chrome this中运行它时,结果是:

second.prototype

您能帮我这个忙吗?

3 个答案:

答案 0 :(得分:3)

  

second的原型分配了一个新对象

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

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

等同于

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

但这与继承无关。

几乎只有在构造函数上使用了名为"prototype"的属性(例如您的first),即使这样,它也没有被用作函数本身的原型。它将用作以后从new ThatFunction()创建的所有实例的原型。

你能做的是

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

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

答案 1 :(得分:1)

使用second.prototype代替second

我已经编辑了您的代码。

function first() {};
first.prototype.hello = function hello() {
    console.log("hello");
}

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

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

second.hello();

答案 2 :(得分:0)

Object.create () returns the created object,您需要将其存储在second变量中,而不是存储在second.prototype中。它不会返回Object原型,而是返回整个Object本身。

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