[英]why the prototype of an object which created by new Object() is undefined?
[英]Why is prototype of my object undefined?
我創建了這樣的Car
對象。
var Car = Object()
然后我在上面添加了一些屬性
Car.price = 5000;
Car.color = "red";
然后我創建了一個實例
var car1 = Object.create(Car);
我不明白的是,當我調用car1.prototype
或Car.prototype
,我得到了undefined
。
根據我所讀到的,每個對象都是某種東西的原型。
有人可以解釋為什么它是“未定義的”?
每個對象都是某種東西的原型
不。每個對象都有一個原型(根對象除外)。 但是,只有函數具有prototype
屬性 。
該屬性的值將成為通過將函數作為構造函數調用而創建的對象的原型(例如, var obj1 = new Constr();
)。
我不明白的是,當我調用
car1.prototype
或Car.prototype
,我得到了undefined
。
如上所述,只有函數具有prototype
屬性。 car1
和Car
是對象,因此沒有這樣的屬性。
要獲取任意對象的原型,可以使用Object.getPrototypeOf
:
var car1Prototype = Object.getPrototypeOf(car1);
然后我創建了一個像
var car1 = Object.create(Car);
的實例var car1 = Object.create(Car);
您沒有創建Car
的實例。 如果您創建了一個新對象並將其原型顯式設置為Car
。 或者,您可以將Car
定義為構造函數:
function Car(price, color) {
this.price = price;
this.color = color;
}
var car1 = new Car(5000, 'red');
現在, Car
是一個函數, Car.prototype
將產生的原型car1
,即
Car.prototype === Object.getPrototypeOf(car1);
函數有原型。 像car1
這樣的對象實例卻沒有。
說每個對象都是一些原型的副本是正確的。 默認情況下,對象是Object
“功能”原型的副本。 但是,對象實例本身沒有原型。
將原型視為新對象的“模型”。 在面向對象的語言中, class
或struct
行為類似於新實例的嚴格模型。 也就是說, Car
類的每個實例都必須具有motor
。 同樣,在JavaScript中,函數原型就像該函數的新實例的“模型”,但它們並不嚴格。 從該模型創建實例后,您可以添加和刪除成員,因為該語言是動態的。
編輯
正如Pointy澄清的那樣,對象實例似乎不是“模型”函數prototype
屬性的副本。 似乎原型被復制到一個內部對象,當您嘗試訪問實例化對象的屬性時,該對象會被查找。
例:
var car1 = new Car();
// car1 now is not a copy of Car.prototype, but it has an internal object that is.
car1.motor = new V8Motor();
// even though motor is not a property of car1, this will work because JavaScript will find this property in the car1 prototype as it's not a member of the instance itself
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.