[英]At what point is the prototype Object born in JavaScript?
假設我有一個構造函數:
function Cat()
{
this.tail = "long";
this.colour = "black";
}
console.log(Cat.prototype);
// returns an empty [object Object] with no properties (checked with `for...in` loop).
所以在這一點上似乎Cat.prototype
沒有tail
和colour
。
var Charlie = new Cat();
console.log(Charlie.tail);
那么,如果Charlie
沒有在其原型中定義,它如何繼承Cat
的屬性。 我假設原型對象的整個要點是鏡像或存儲將由所有cat
實例繼承的構造函數的屬性 - 這是錯誤的嗎?
原型Object在什么時候填滿了這些屬性? 或者只有在我明確設置Cat.prototype.eyes = brown
作為示例時才會發生這種情況?
此外,查詢Object原型屬性的正確方法是什么? 它是for...in
循環? 我猜它不能是Object.getOwnPropertyNames(Cat.prototype)
因為它不會返回繼承的屬性。
您正在直接在實例上定義tail
和colour
屬性。 這些屬性未在prototype
對象上定義。
順便說一句,每個函數都有一個prototype
屬性,它是在創建函數本身時創建的。
prototype
與this
完全分開。
所有的事情this
不會得到繼承,在事物prototype
意願。 默認情況下,您從Object.prototype
(它是空的)繼承
function Cat()
{
this.tail = "long";
this.colour = "black";
}
Cat.prototype.getColour = function () {
return this.colour;
}
WhiteCat.prototype = Cat.prototype;
WhiteCat.prototype.constructor = WhiteCat;
function WhiteCat(name){
Cat.call(this);
this.colour = "white";
}
var c = new Cat();
console.log(c.getColour()); // "black"
var w = new WhiteCat();
console.log(w.getColour()); // "white"
Javascript中的原型與您描述的有點不同。 在這種情況下, Charlie
確實有一個尾巴,因為Charie
是一只Cat
,即他是貓類Cat
的一個實例。 在Cat
函數中,使用this.tail =
行將tail屬性添加到所有貓。 這完全是因為您使用new
關鍵字調用函數Cat
。 當你這樣做,JavaScript的創建一個新的對象,然后讓this
點在函數的上下文對象。
現在原型的工作方式不同,如果你去尋找一個對象中沒有的屬性或函數,它們最好被認為是一個鏈條。 例如,如果嘗試去:
Charlie.tickle_wiskers();
Javascript將在charlie對象中尋找一個名為tickle_wiskers
的函數。 如果它沒有找到該函數,它將在Charlies原型中查找(默認情況下,如果未明確設置,則默認為Object.prototype
)。 最后,我可以通過這樣的方式給所有功能的貓:
Cat.prototype.tickle_wiskers = function() {
alert('meow');
}
原型永遠不會獲得您放入對象的屬性。 該對象具有原型的成員,但原型沒有該對象的成員。
該對象不會繼承原型中的任何內容,原型中的成員仍然只存在於原型中,它們只能從對象中訪問。 如果在創建對象后從protype中刪除了某些內容,則該對象也不再可以從該對象訪問。
函數具有prototype
屬性,當您使用new
關鍵字將函數作為構造函數調用時,創建的對象將從函數中獲取原型。
如果向函數原型添加內容,即使您在將其添加到原型之前創建它們,也可以使用該函數創建的對象訪問它:
function Cat() {}
var c = new Cat();
Cat.prototype.test = function() {
alert('test');
};
c.test(); // alerts 'test'
此外,查詢Object原型屬性的正確方法是什么?
var myProto = Object.getPrototypeOf(someObject);
var names = Object.getOwnPropertyNames(myProto);
names.forEach(function (name) {
value = myProto[name];
...
});
或者只有在我明確設置Cat.prototype.eyes = brown作為示例時才會發生這種情況?
是,僅在手動設置對象的[[Prototype]]
時設置屬性。
但由於原型的每個“實例”都有一個指向原型對象的實時指針,因此這些更改將在創建對象后反映出來。
存儲將由cat的所有實例繼承的構造函數的屬性 - 這是錯誤的嗎?
我們不在原型上存儲對象的屬性。 我們存儲我們想要在原型/構造函數的所有實例之間共享的屬性(主要是方法)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.