簡體   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