在Javascript中重置原型。为什么它会破坏原型继承链?

时间:2015-10-19 05:06:00

标签: javascript prototype

我有这段代码:

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
  1. 实例是什么样的方法?为什么不在对象上调用它?
  2. 为什么设置PrintStuff的原型会破坏打印机对象的继承链?

2 个答案:

答案 0 :(得分:2)

  1. instanceof是一个运算符,而不是一个方法。你写的是1 +(2)

  2. PrintStuff.prototype不是 PrintStuff的原型;它是{em> for PrintStuff构造函数创建的对象的原型。替换它时,之后创建的任何对象将不再具有.print方法。 printer仍然有,因为它仍然有原型。

  3. (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函数。