繁体   English   中英

isPrototypeOf在Javascript中

[英]isPrototypeOf in Javascript

我是JavaScript的初学者,也是我在JavaScript中使用Prototypes的途中。
根据这里的文章

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

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'属性指向将在使用'new'时将被指定为使用该函数创建的实例原型的对象。

我同意术语不正确。

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

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

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

myFather将是一个personinstanceof ,您可以使用以下行测试它。

alert(myFather instanceof person); // true

你在说什么,

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

对我来说没有多大意义,但我认为你有正确的想法。

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

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


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

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

function Person(name){
    this.name = name;
}
Person.prototype = {
    species: "Human"
};

使用包含属性species的prototype属性设置构造函数。

现在,如果我们这样做:

var joe = new Person("Joe");

乔是一个看起来像的对象

{
    name:    "Joe",
    species: "Human"
}

如您所见, Person()原型的属性被设置为Joe的常规属性。

TL; DR

所以我认为你有正确的想法。

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

基本上,无论何时在JavaScript中创建函数,它都会自动在其上有一个名为.prototype的属性,与之关联的值将是一个对象。 在您的情况下, person函数也具有此.prototype属性。 当您创建person新实例时,每个实例将被设置为继承自与person函数的.prototype属性相关联的对象 - 实例的原型。 此继承意味着将属性查找委托给此原型对象。 这里的关键是当你的person实例查找一个属性时,他们将首先查找属性,如果找不到属性,它们将上升到原型链。

看看你的例子,这是正确的:

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

换句话说,只要实例无法在自身上找到属性,任何人的实例都知道委托 person.prototype相关联的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM