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
。
要让 person1
给 true
,您必须循环调用直到达到 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 {}
Person
与 Object
不同,因此检查是否相等 returns false。
这是我的示例代码
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
。
要让 person1
给 true
,您必须循环调用直到达到 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 {}
Person
与 Object
不同,因此检查是否相等 returns false。