【问题标题】:Object.getPrototypeOf and example.isPrototypeOf(obj) gave confusing resultsObject.getPrototypeOf 和 example.isPrototypeOf(obj) 给出了令人困惑的结果
【发布时间】:2016-02-06 17:16:57
【问题描述】:

我读到Object.gePrototypeOf(someObject) 返回传递对象的原型,如果aPrototypesomeObject 的原型,aPrototype.isPrototypeOf(someObject) 返回 true。对我来说很明显,如果Object.getPrototypeOf(someObject) 返回一个名为aPrototype 的原型,那么aPrototype.isPrototypeOf(someObject) 将返回true。但这并没有发生在我的代码中:

function person(fname, lname)
{
  this.fname = fname;
  this.lname = lname;   
}

var arun = new person('Arun', 'Jaiswal');

console.log(Object.getPrototypeOf(arun));  //person
console.log(person.isPrototypeOf(arun));   //false

怎么了?

【问题讨论】:

  • @GameAlchemist:不。 isPrototypeOf 也测试了整个链,与instanceof 的不同之处在于它不使用.prototype 用于在链中查找的构造函数。

标签: javascript prototypal-inheritance


【解决方案1】:

根据MDNisPrototype的语法是

prototypeObj.isPrototypeOf(obj)

另请参阅isPrototypeOf vs instanceof

function person(fname, lname)
{
  this.fname = fname;
  this.lname = lname;   
}

var arun = new person('Arun', 'Jaiswal');

console.log(Object.getPrototypeOf(arun));  //person
console.log(person.prototype.isPrototypeOf(arun));

【讨论】:

    【解决方案2】:

    arun的原型不是person而是person.prototype

    Object.getPrototypeOf(arun) === person.prototype; // true
    person.prototype.isPrototypeOf(arun); // true
    

    【讨论】:

    • 那么 isPrototypeOf() 的工作到底是什么?
    【解决方案3】:

    isPrototypeOf 不是在构造函数本身上调用,而是在构造函数的原型属性上调用。

    alert(person.prototype.isPrototypeOf(arun)); // true
    

    这表示arun的原型不是person,而是person.prototype

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多