4

Object.getPrototypeOf(obj)はどのように機能しますか?

定義に従って、Object.getPrototypeOf(obj)は、オブジェクトのプロトタイププロパティを返すか、別の方法で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(a)はHTMLDivElementを返す必要がありますが、HTMLElementを返します。getPrototypeOf()の定義と完全に混同しています。

>b = Object.getPrototypeOf(a)

HTMLElement ---->なぜですか?a.constructor.prototypeはHTMLDivElementです

実際には、プロトタイプのprotoプロパティを返していますが、getPrototypeOf()の定義に従って間違っているのではないでしょうか。

>a.constructor.prototype.__proto__
 HTMLElement
4

2 に答える 2

12

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)関数は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/474290 とこの https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Inheritance_Revisitedもお読みください

于 2012-04-04T15:37:13.157 に答える
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.getPrototypeOf戻るobject.__proto__object.constructor.prototype

于 2012-04-04T15:27:29.087 に答える