使用constructor.prototype遍历原型链

use*_*031 7 javascript constructor prototype

如果我可以obj.constructor.prototype用来访问对象的原型,那么为什么我不能obj.constructor.prototype.constructor.prototype用来遍历原型链并且必须使用Object.getPrototypeOf

function MyConstructor()
{
    this.prop = 1;
}

var o = new MyConstructor();

console.log(o.constructor.prototype) // MyConstructor

console.log(o.constructor.prototype.constructor.prototype) // MyConstructor?
Run Code Online (Sandbox Code Playgroud)

它不应该返回MyConstructor的原型function() { [native code] }(在Chrome控制台中)吗?

dku*_*ppi 8

所有构造函数都是全局Function对象的实例:

function Foo(){ this.x = 1 }; // Dummy constructor function

console.log(Foo instanceof Function) // => true; Foo is an instance of global Function constructor
Run Code Online (Sandbox Code Playgroud)

所有原型都是全局Object对象的实例:

console.log(Foo.prototype instanceof Object); // => true
Run Code Online (Sandbox Code Playgroud)

Foo定义构造函数时,它会自动Foo.prototype附加一个对象,您可以将其视为一个"空白"对象,按照上面的说明,它继承自全局Object对象.换句话说,原型Foo.prototypeObject.prototype:

function Foo(){ this.x = 1 }; // Dummy constructor function

console.log(Foo.prototype); // Foo (object); already exists

console.log(Object.getPrototypeOf(Foo.prototype) === Object.prototype); // => true
Run Code Online (Sandbox Code Playgroud)

由于Foo.prototype是一个空白对象,人们会期望它的构造函数是全局Object构造函数:

function Foo(){ this.x = 1 }; // Dummy constructor function

console.log(Foo.prototype.constructor) // => function Foo() { this.x = 1; } ??

console.log(Foo.prototype.constructor === Object.prototype.constructor); // => false
Run Code Online (Sandbox Code Playgroud)

但是,此"空白"对象具有显式的自引用constructor属性,该属性指向function Foo(){ this.x = 1 }并覆盖或"屏蔽"您期望的默认构造函数属性:

function Foo(){ this.x = 1 }; // Dummy constructor function

delete Foo.prototype.constructor; // Delete explicit constructor property

console.log(Foo.prototype.constructor) // => function Object() { [native code] }

console.log(Foo.prototype.constructor === Object.prototype.constructor); // => true
Run Code Online (Sandbox Code Playgroud)

因此,您不能obj.constructor.prototype递归地使用遍历原型链并且必须依赖该Object.getPrototypeOf()方法.

这是一个很棒的视觉参考.