我有这段代码:
function PrintStuff(docs) {
this.docs = docs;
}
PrintStuff.prototype.print = function() {
console.log(this.docs)
}
var printer = new PrintStuff("Hello World");
printer.print()
console.log(Object.getPrototypeOf(printer))
console.log(PrintStuff.prototype)
console.log(printer instanceof(PrintStuff))
//true
PrintStuff.prototype = {}
console.log(printer instanceof(PrintStuff))
//false
答案 0 :(得分:2)
instanceof
是一个运算符,而不是一个方法。你写的是1 +(2)
。
PrintStuff.prototype
不是 PrintStuff
的原型;它是{em> for 由PrintStuff
构造函数创建的对象的原型。替换它时,之后创建的任何对象将不再具有.print
方法。 printer
仍然有,因为它仍然有原型。
(1 + 2,真的):正如MDN所说,instanceof运算符测试对象(printer
)在其原型链(旧PrintStuff.prototype
)中是否具有a的prototype属性构造函数(新PrintStuff.prototype
或{}
)。“由于两者明显不同,instanceof
会返回false
。
答案 1 :(得分:1)
instanceof是JavaScript运算符 - 它检查函数(构造函数)的原型对象是否存在于被检查对象的原型链中。
使用 new 创建对象时,javascript会将对象的内部原型设置为链接到新的< d功能的原型对象。当您将新的“d”函数更改为具有不同的原型对象时,原始创建的对象仍会链接到新的函数原始对象。
(在Chrome中),您可以访问对象的内部原型链接,因此可以通过执行PrintStuff.prototype = printer.__proto__
来反转它,如果这样可以让您更好地了解对象的内容。
你是什么意思"反过来"?
最初,当您创建PrintStuff函数时,PrintStuff对象将链接到其原型,如下所示:
[PrintStuff] --- prototype ---> [PrintStuffPrototype]
当你这样做时:PrintStuff.prototype = {}
你得到:
[PrintStuff] -link lost- [PrintStuffPrototype]
`.
`---- prototype ---> {}
PrintStuffPrototype对象挂在内存中。反转它意味着将原始PrintStuffPrototype重新链接到PrintStuff函数。