Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165290
  • 博文数量: 26
  • 博客积分: 1225
  • 博客等级: 中尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-06 21:11
文章分类

全部博文(26)

文章存档

2018年(2)

2014年(1)

2011年(3)

2010年(2)

2009年(1)

2008年(17)

我的朋友

分类: 系统运维

2010-03-10 19:35:12

 
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) |
给主人留下些什么吧!~~