[英]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
將是一個person
的instanceof
,您可以使用以下行測試它。
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的常規屬性。
所以我認為你有正確的想法。
我同意你的意思 - 句子“ 構造函數是你的人物對象的原型 ”是令人困惑和不准確的。 相反,你的理解是正確的,盡管讓我詳細說明。
基本上,無論何時在JavaScript中創建函數,它都會自動在其上有一個名為.prototype
的屬性,與之關聯的值將是一個對象。 在您的情況下, person
函數也具有此.prototype
屬性。 當您創建person
新實例時,每個實例將被設置為繼承自與person
函數的.prototype
屬性相關聯的對象 - 實例的原型。 此繼承意味着將屬性查找委托給此原型對象。 這里的關鍵是當你的person
實例查找一個屬性時,他們將首先查找屬性,如果找不到屬性,它們將上升到原型鏈。
看看你的例子,這是正確的:
person.prototype.isPrototypeOf( new person() );
換句話說,只要實例無法在自身上找到屬性,任何人的實例都知道委托 person.prototype
相關聯的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.