4

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

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

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

Объекты, созданные с новым, используют значение свойства 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 ---- & gt; Зачем? a.constructor.prototype - это HTMLDivElement

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

>a.constructor.prototype.__proto__
 HTMLElement
  • object .__ proto__ и object.constructor.prototype определенно не совпадают .. поэтому я не получаю никакой части вашей логики.

    от P K
  • 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 )

  • 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