2012-04-04 13 views
4

Object.getPrototypeOf(obj)如何工作?Object.getPrototypeOf()混淆

根據定義Object.getPrototypeOf(obj)應該返回一個Object的prototype屬性,或者以另一種方式它與obj.constructor.prototype相同。

使用new創建的對象使用其構造函數的prototype屬性的值作爲其原型。

讓我們舉個例子:

>element = document.getElementById("test") 

>a = Object.getPrototypeOf(element) 
HTMLDivElement 

比方說HTMLDivElement是元素的原型。

>a.constructor.prototype 
HTMLDivElement 

所以a.constructor.prototype是HTMLDivElement所以Object.getPrototypeOf(一)應返回HTMLDivElement但它返回HTML元素。我完全和getPrototypeOf()的定義混淆了。

>b = Object.getPrototypeOf(a) 

HTMLElement ---->爲什麼? a.constructor.prototype是HTMLDivElement

其實它是返回原型原型的屬性,是不是錯誤的定義getPrototypeOf()?

>a.constructor.prototype.__proto__ 
HTMLElement 

回答

11

引自https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Inheritance_Revisited

JavaScript是一個有點混亂,開發商從Java或C來++, 因爲它的所有動態,所有運行時,並且它根本沒有類。它是 所有隻是實例(對象)。即使是我們模擬的「類」也只是一個函數對象 。


注意的是原型也是一個對象,所以它也可以有它自己獨特的原型

這樣的代碼,讓你分不清這個樣子

a = Object.getPrototypeOf(element) 
b = Object.getPrototypeOf(a) 

可翻譯爲此

a = element.__proto__ 
b = element.__ptoto__.__proto__ 

我認爲這是現在很清楚,a != b


1)在JavaScript 對象已具雛形,您可以通過__proto__財產

2)功能是訪問還有一個對象 in Javascript

3)功能也都有一個prototype財產

4)我們可以通過調用函數關鍵字創建JavaScript對象new

4)功能prototype初始__proto__由他們創建的任何對象


要創建新的對象,我們可以寫這樣的東西

//here we define a function 
function SomeFunctionThatCreateObject() { 
    this.someStringProperty = "blablabla"; 
} 

var obj = new SomeFunctionThatCreateObject(); //we create new object with function 

var p = Object.getPrototypeOf(obj); 

這個碼等於本

var SomeFunctionThatCreateObject = function(@this) { 
    @this.someStringProperty = "blablabla"; 
    return @this; 
}; 

SomeFunctionThatCreateObject.prototype = {}; //note that prototype is also an object 

var obj = {}; 

obj = SomeFunctionThatCreateObject(obj); 

obj.constructor = SomeFunctionThatCreateObject; 

obj.__proto__ = SomeFunctionThatCreateObject.prototype; 

var p = obj.__proto__; 

PS:也可以參考此 https://stackoverflow.com/a/9220317/474290https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Inheritance_Revisited

0
var elem = document.getElementsByTagName("div")[0], 
a = Object.getPrototypeOf (elem); 
console.log(elem.__proto__); //HTMLDivElement 
console.log(a); // HTMLDivElement 
console.log(a.__proto__); //HTMLElement 
console.log(Object.getPrototypeOf (a)); //HTMLElement 

所以Object.getPrototypeOfobject.__proto__object.constructor.prototype

+0

對象.__ proto__和object.constructor.prototype兩者都是肯定不一樣..所以我沒有得到你的邏輯的任何部分。 – 2012-04-04 16:30:39