我已经了解了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
您能帮我这个忙吗?
答案 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)