Object.getPrototypeOf() confusion

Object.getPrototypeOf() confusion

本文关键字:confusion getPrototypeOf Object      更新时间:2023-09-26

Object.getPrototypeOf(obj)是如何工作的?

根据定义,Object.getPrototypeOf(obj)应该返回Object的原型属性,或者以其他方式返回与obj.structor.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)

HTML元素---->为什么?a.constructor.prototype是HTMLDivElement

实际上,它返回了prototype的proto属性,根据getPrototypeOf()的定义,这不是错误的吗?

>a.constructor.prototype.__proto__
 HTMLElement

引用自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) 我们可以通过调用关键字为new 的函数在JavaScript中创建对象

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__;

附言:也读这个https://stackoverflow.com/a/9220317/474290这个https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Inheritance_Revisited

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