JavaScript 原型制作 - 差异

JavaScript protyping - differences

这是我的示例代码

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype  = {
  constructor: Person,
  printInformation: function() {
    console.log(this.toString());
  },
  toString: function() {
    return "Name: " + this.name + ", Age: " + this.age;
  }
};

var person1 = new Person("Some Name", 15);
person1.printInformation();
console.log(typeof(person1));
console.log(Object.getPrototypeOf(person1) === Object.prototype);

var book = {
  title: "Some book",
  author: "Some author",
  printInformation: function() {
    console.log(this.toString());
  },
  toString: function() {
    return "Book: " + this.title + ", Author(s): " + this.author;
  }
};

book.printInformation();
var bookPrototype = Object.getPrototypeOf(book);
console.log(typeof(book));
console.log(Object.getPrototypeOf(book) === Object.prototype);

输出:

Name: Some Name, Age: 15
object
false
Book: Some book, Author(s): Some author
object
true

为什么 Object.getPrototypeOf(person1) === Object.prototype return 为假而 Object.getPrototypeOf(book) === Object.prototype return 为真?

两者都是对象的实例,都指向一个原型,我希望,两者都应该 return 为真。请赐教。

person1的原型链是这样的:

person1 ---> Person.prototype ---> Object.prototype ---> null

book的原型链是这样的:

book ---> Object.prototype ---> null

Object.getPrototypeOf() 方法 return 是原型链中的 下一个 项。因此,person1 不是 return Object.prototype,因此是 false


要让 person1true,您必须循环调用直到达到 Object.prototype

var obj = person1

while (obj) {
    if (obj === Object.prototype) {
        console.log("found it!");
        break;
    }
    obj = Object.getPrototypeOf(obj);
}

或者如果原型对象确实在一个函数上,您可以只使用 instanceof

person1 instanceof Object; // true
book instanceof Object; // true

instanceof 搜索您提供的对象的原型链,看它是否有与您提供的函数的 .prototype 相匹配的对象,在本例中是 Object函数。

使用 Person 原型,您明确定义为 'Person' 类型对象,而对于 book,它只是一个恰好具有book 的变量名称。

Object.getPrototypeOf(book)

控制台输出Object {}

Object.getPrototypeOf(person1)

控制台输出Person {}

PersonObject 不同,因此检查是否相等 returns false。