簡體   English   中英

在什么時候原型Object出現在JavaScript中?

[英]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沒有tailcolour

var Charlie = new Cat();
console.log(Charlie.tail);

那么,如果Charlie沒有在其原型中定義,它如何繼承Cat的屬性。 我假設原型對象的整個要點是鏡像或存儲將由所有cat實例繼承的構造函數的屬性 - 這是錯誤的嗎?

原型Object在什么時候填滿了這些屬性? 或者只有在我明確設置Cat.prototype.eyes = brown作為示例時才會發生這種情況?

此外,查詢Object原型屬性的正確方法是什么? 它是for...in循環? 我猜它不能是Object.getOwnPropertyNames(Cat.prototype)因為它不會返回繼承的屬性。

您正在直接在實例上定義tailcolour屬性。 這些屬性未在prototype對象上定義。

順便說一句,每個函數都有一個prototype屬性,它是在創建函數本身時創建的。

prototypethis完全分開。

所有的事情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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM