Object.getPrototypeOf()混淆

P K*_*P K 4 javascript dom

Object.getPrototypeOf(obj)如何工作?

根据定义,Object.getPrototypeOf(obj)应该返回Object的prototype属性,或者以其他方式与obj.constructor.prototype相同.

使用new创建的对象使用其构造函数的prototype属性的值作为其原型.

让我们举一个例子:

>element = document.getElementById("test")

>a = Object.getPrototypeOf(element)
HTMLDivElement
Run Code Online (Sandbox Code Playgroud)

假设HTMLDivElement是元素的原型.

>a.constructor.prototype
HTMLDivElement
Run Code Online (Sandbox Code Playgroud)

所以a.constructor.prototype是HTMLDivElement所以Object.getPrototypeOf(a)应该返回HTMLDivElement,但它返回HTMLElement.我对getPrototypeOf()的定义感到困惑.

>b = Object.getPrototypeOf(a)
Run Code Online (Sandbox Code Playgroud)

HTMLElement ---->为什么?a.constructor.prototype是HTMLDivElement

实际上它正在返回原型的proto属性,根据getPrototypeOf()的定义是不是错了?

>a.constructor.prototype.__proto__
 HTMLElement
Run Code Online (Sandbox Code Playgroud)

obe*_*iro 12

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

JavaScript对于来自Java或C++的开发人员来说有点令人困惑,因为它都是动态的,所有运行时,并且它根本没有类.它只是实例(对象).甚至我们模拟的"类"也只是一个函数对象.


请注意,原型也是一个对象,所以它也有自己独特的原型

所以让你混淆的代码看起来像这样

a = Object.getPrototypeOf(element)
b = Object.getPrototypeOf(a)
Run Code Online (Sandbox Code Playgroud)

可以翻译成这个

a = element.__proto__
b = element.__ptoto__.__proto__ 
Run Code Online (Sandbox Code Playgroud)

我想现在已经很清楚了 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);
Run Code Online (Sandbox Code Playgroud)

这段代码与此相同

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__;
Run Code Online (Sandbox Code Playgroud)

PS:还阅读了这个 /sf/answers/645422221/ 和这个 https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Inheritance_Revisited