Вопрос по javascript, dom – Object.getPrototypeOf () путаница

4

Как работает Object.getPrototypeOf (obj)?

В соответствии с определением Object.getPrototypeOf (obj) должен возвращать свойство prototype объекта Object или другим способом оно совпадает с obj.constructor.prototype.

Объекты, созданные с новым, используют значение свойства prototype их функции конструктора в качестве своего прототипа.

Давайте возьмем пример:

<code>>element = document.getElementById("test")

>a = Object.getPrototypeOf(element)
HTMLDivElement
</code>

Допустим, HTMLDivElement является прототипом элемента.

<code>>a.constructor.prototype
HTMLDivElement
</code>

поэтому a.constructor.prototype - это HTMLDivElement, поэтому Object.getPrototypeOf (a) должен возвращать HTMLDivElement, но возвращает HTMLElement. Я полностью запутался с определением getPrototypeOf ().

<code>>b = Object.getPrototypeOf(a)
</code>

HTMLElement ---- & gt; Зачем? a.constructor.prototype - это HTMLDivElement

На самом деле это возвращениеproto свойство prototype, не так ли это согласно определению getPrototypeOf ()?

<code>>a.constructor.prototype.__proto__
 HTMLElement
</code>

Ваш Ответ

2   ответа
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 )

object .__ proto__ и object.constructor.prototype определенно не совпадают .. поэтому я не получаю никакой части вашей логики. P K
11

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

JavaScript is a bit confusing for developers coming from Java or C++, as it's all dynamic, all runtime, and it has no classes at all. It's all just instances (objects). Even the "classes" we simulate are just a function object.

NOTE that prototype is also AN OBJECT, so it ALSO CAN HAVE IT'S OWN UNIQUE PROTOTYPE

так что код, который вас смущает, выглядит так

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

можно перевести на это

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

I think it's now clear that a != b

1) каждыйobject в JavaScripthas a prototypeВы можете получить к нему доступ через__proto__ имущество

2) Function такжеobject в JavaScript

3) Функции также имеютprototype имущество

4) Мыcan создавать объекты в JavaScript, вызывая функцию с ключевым словомnew

4) Функцияprototype этоinitial __proto__ для любых объектовcreated by them

Для создания нового объекта мы можем написать что-то вроде этого

//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

Похожие вопросы