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控制台中)吗?
所有构造函数都是全局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.prototype是Object.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()方法.
这是一个很棒的视觉参考.