1、首先prototype是函数的属性,可以让函数定义成为类,其类型变量具有prototype中所有属性(可能是函数直接引用,非函数成员拷贝),所以prototype其实是一个可供继承(变量也拥有)的属性集。
2、关于constructor,需要先了解一下函数定义(构造函数,即类)时的一些特殊处理:
当声明自定义类型MyClass(定义函数)时,它的prototype属性即为Function.prototype的部分引用,但要注意prototype.constructor成员会修改成函数自身名称,而当声明该类型变量p、q时,则会直接继承MyClass.prototype中的成员属性。
3、根据上面描述可知,对MyClass.prototype赋值时会导致它指向了Object.prototype,特别是MyClass.prototype.constructor被覆盖成了Object构造函数,因此变量q的constructor属性即指向了Object函数。
var console = {}; console.log = alert; function MyClass(name) { this.name = name; }; MyClass.prototype.getName = function() { return this.name; }; var p = new MyClass("ZhangSan"); console.log(p.constructor); // MyClass
console.log(p.constructor.constructor); // Function
console.log(MyClass.constructor); // Function,此处等价于上面一种情况,因为p.constructor === Persion
console.log(MyClass.prototype.constructor); // MyClass
console.log(p.constructor.prototype.constructor); // MyClass,此处与上面等价,同样因为p.constructor === Persion
//MyClass.prototype = {} 等价于 MyClass.prototype = new Object() MyClass.prototype = { getName: function() { return this.name; } }; var q = new MyClass("ZhangSan"); console.log(q.constructor); // Object
console.log(MyClass.constructor); // Function
console.log(MyClass.prototype.constructor); // Object,对prototype赋值导致prototype中的constructor成员被Object中的同名属性覆盖
console.log(q.constructor.prototype.constructor);
|
阅读(2364) | 评论(0) | 转发(0) |