Javascript中的isPrototypeOf

Javascript中的isPrototypeOf,javascript,prototype,Javascript,Prototype,我是JavaScript的初学者,正在学习JavaScript的原型 根据文章 创建原型 创建对象原型的标准方法是使用对象构造函数: function person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } 通过构造函数,您可以使用new关键字从同一原型创建新对象:

我是JavaScript的初学者,正在学习JavaScript的原型
根据文章

创建原型
创建对象原型的标准方法是使用对象构造函数:

function person(first, last, age, eyecolor) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
}
通过构造函数,您可以使用new关键字从同一原型创建新对象:

var myFather = new person("John", "Doe", 50, "blue");
var myMother = new person("Sally", "Rally", 48, "green");
构造函数是person对象的原型。
我发现自己对上面的粗线条感到困惑,我认为这是完全错误的

原因:

alert(person.isPrototypeOf(myFather));  // false
我这样说对吗?因为我相信这句话:

“prototype”属性指向将被指定为原型的对象 使用“新建”时使用该函数创建的实例的数量

你在说什么,

“prototype”属性指向使用“new”时将被指定为使用该函数创建的实例原型的对象

对我来说没什么意义,但我认为你的想法是对的

至少对我来说,
构造函数是person对象的原型。
这是错误的

正确的版本应该是:
构造函数是person对象的构造函数。


构造函数的prototype属性是一个对象

它包含分配给使用该构造函数实例化的对象的属性,例如:

function Person(name){
    this.name = name;
}
Person.prototype = {
    species: "Human"
};
使用prototype属性设置构造函数,该属性包含属性
species

现在,如果我们这样做:

var joe = new Person("Joe");
乔是一个看起来像

{
    name:    "Joe",
    species: "Human"
}
如您所见,
Person()
原型的属性被设置为Joe的正常属性

TL;博士
因此,我认为您的想法是正确的。

我同意您的看法-句子“构造函数是person对象的原型””令人困惑且不准确。相反,你的理解是正确的,尽管让我详细说明一下

基本上,无论何时在JavaScript中创建函数,它都会自动拥有一个名为
.prototype
的属性,并且与之关联的值将是一个对象。在您的例子中,
person
函数也有这个
.prototype
属性。创建
person
的新实例时,每个实例都将设置为从与
person
函数的
.prototype
属性(实例的原型)关联的对象继承。此继承意味着属性查找被委派给此原型对象。这里的关键是,当您的
person
实例查找属性时,它们将首先查找自己的属性,如果未找到该属性,它们将进入原型链

看看你的例子,下面是正确的:

person.prototype.isPrototypeOf( new person() );

换句话说,person的任何实例都知道,只要实例本身找不到属性,就会将委托给与
person.prototype
关联的对象。

我同意术语是不正确的

构造函数有一个
prototype
属性,它定义了prototype链中的属性和方法;但它本身并不是对象的原型,而是构造函数

不是对构造函数本身调用,而是对构造函数的prototype属性调用

alert(person.prototype.isPrototypeOf(myFather)); // true
myFather
将是一个
,您可以使用以下行测试这一点

alert(myFather instanceof person); // true

您根本不使用prototype,所以在您的情况下,这应该是正确的,
MyDather instanceof person
my 2cents是的,这条线绝对错误。@mfreitas:您的链接说W3Schools为初学者提供了不错的学习体验。@sixfingeredman确实如此,它还说W3Schools仍然存在问题。这些问题已经误导人们一段时间了。另外,isPrototypeOf不是在构造函数本身上调用的,而是在构造函数的原型属性上调用的。你添加的一行很好的代码对我很有帮助。你的公式化方式听起来好像原型链知道构造函数并遵循它们的
.prototype
属性。你能帮我解决这个问题吗?@Bergi不知道你的意思-也许这就是我用词的方式?你能提出一些改进我所写内容的建议吗?属性的委托不会指向
person
s
.prototype
属性引用的对象。是的,它是同一个对象,但是委托过程不知道关于
person
——只知道它从中继承的原型对象。我试着重新表述你的回答,当你不喜欢时请回退。不!原型上的属性未“指定”给实例
joe
没有(自己的)
species
属性,它“看起来”不是那样的。我同意@Bergi的观点,
joe
对象看起来不是那样的。它看起来是这样的:
{name:'Joe'}
,另外要注意的是,将有一个prototype属性指向
prototype
对象。@wmok否,请在js控制台中尝试
joe.species
存在,
joe.prototype
不存在。@theonlygusti:您正在查找
对象。hasOwnProperty(joe,“species”)
(false)和
Object.getPrototypeOf(joe)
(原型链属性)