首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript中的isPrototypeOf

Javascript中的isPrototypeOf
EN

Stack Overflow用户
提问于 2015-01-12 02:11:32
回答 3查看 2K关注 0票数 10

我是JavaScript的初学者,正在学习JavaScript中的原型。

根据文章here

创建原型

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

代码语言:javascript
复制
function person(first, last, age, eyecolor) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
}

通过构造函数,您可以使用new关键字从同一原型创建新对象:

代码语言:javascript
复制
var myFather = new person("John", "Doe", 50, "blue");
var myMother = new person("Sally", "Rally", 48, "green");

构造函数是person对象的原型。

我发现我自己对上面的粗体字感到困惑,我认为这是绝对错误的。

原因:

代码语言:javascript
复制
alert(person.isPrototypeOf(myFather));  // false

我这样说是正确的吗,因为我相信这一行:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-12 02:24:21

我同意术语是不正确的。

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

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

代码语言:javascript
复制
alert(person.prototype.isPrototypeOf(myFather)); // true

myFather将是一个instanceof person,您可以使用下面的代码行对其进行测试。

代码语言:javascript
复制
alert(myFather instanceof person); // true
票数 11
EN

Stack Overflow用户

发布于 2015-01-12 02:24:06

我同意你的观点--“这个构造函数是你的person对象的原型”这句话令人困惑,而且不准确。相反,您的理解是正确的,尽管我将详细说明。

基本上,每当您在JavaScript中创建一个函数时,它都会自动拥有一个名为.prototype的属性,并且与其关联的值将是一个对象。在本例中,person函数也具有此.prototype属性。在创建person的新实例时,每个实例都将设置为继承与person函数的.prototype属性关联的对象-实例的原型。这种继承意味着属性查找是这个原型对象的委托。这里的关键是,当您的person实例查找属性时,它们将首先查找自身的属性,如果没有找到该属性,它们将沿着原型链向上查找。

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

代码语言:javascript
复制
person.prototype.isPrototypeOf( new person() );

换句话说,当person实例找不到自身的属性时,它就知道将委托给与person.prototype关联的对象。

票数 4
EN

Stack Overflow用户

发布于 2015-01-12 02:23:55

你在说什么,

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

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

至少对我来说,

构造函数是person对象的原型。

是错误的。

正确的版本应该是:

构造函数是person对象的构造函数。

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

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

代码语言:javascript
复制
function Person(name){
    this.name = name;
}
Person.prototype = {
    species: "Human"
};

设置具有prototype属性的构造函数,其中包含属性species

现在,如果我们这样做:

代码语言:javascript
复制
var joe = new Person("Joe");

joe是一个对象,它看起来像

代码语言:javascript
复制
{
    name:    "Joe",
    species: "Human"
}

正如您所看到的,Person()原型的属性被设置为Joe的普通属性。

TL;DR

所以我认为你的想法是对的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27890392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档