4

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

根据定义 Object.getPrototypeOf(obj) 应该返回 Object 的原型属性,或者以另一种方式它与 obj.constructor.prototype 相同。

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

举个例子:

>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 回答