个人感悟
- 构造器函数的
constructor
等于其本身
1
| console.log(Function.constructor === Function);
|
- 某一构造器的实例,其
constructor
指向该构造器(从实例的角度来看可以理解为指向上一级的构造器)
1 2 3 4 5 6 7
| function foo() { this.name = "xxf"; }
var f1 = new foo();
console.log(f1.constructor === foo);
|
-
只有自身能充当构造器的才会有prototype
-
只要是函数(包括匿名函数)都可以做构造器
1 2 3 4 5 6 7 8
| var fun = new Function(); var fun1 = new fun();
console.log(fun1); console.log(fun); console.log(fun1.constructor === fun); console.log(fun1.prototype);
|
需要注意的是new Function()
直接返回匿名函数对象(而非匿名函数的实例!),所以与直接赋值为匿名函数完全不同(直接赋值匿名函数相当于构造了一个函数对象的实例!):
1 2 3 4 5 6 7
| var fun = function () {
}; var fun1 = new fun();
console.log(fun); console.log(fun1);
|
Object
实例对象的constructor
为[Function: Object]
1
| console.log({}.constructor);
|
-
只要是原型(prototype
),其constructor
必然指向下一级(即若该原型为Object
实例对象,其constructor
并不会指向[Function: Object]
)
-
某个对象原型(prototype
)的constructor
等于该对象本身
1 2 3 4 5 6
| var fun = new Function();
console.log(fun.prototype); console.log(typeof fun.prototype); console.log(fun.prototype.constructor); console.log(fun.prototype.constructor === fun);
|
- 属性
__proto__
指的是上一级构造器的prototype
1 2 3 4 5
| var fun = new Function();
console.log(fun.prototype); console.log(fun.prototype.__proto__); console.log(fun.prototype.__proto__.constructor);
|
从上面的例字可以看出fun
的prototye
确实是object
类型的,但是直接使用construcor
并不能得到想要的结果,通过使用属性__proto__
就能准确得到上一级构造器的原型!
个人总结
参考文档
- js中__proto__和prototype的区别和关系? - 苏墨橘的回答 - 知乎