JavaScritpt 对象小结

构造函数,原型对象,实例对象三者之间的关系

每创建一个函数都含有一个prototype的属性,该属性是一个指针,指向原型对象。

原型对象上含有一个constructor属性,该属性也是一个指针,指向相关联的构造函数。

通过构造函数产生的实例对象含有一个proto属性,指向原型对象,使其能过访问原型对象上的属性和方法。

  • 总结:每个函数都有一个原型对象,原型对象上都有一个指向函数的指针,实例中也有指向原型对象的指针,而原型对象中有可以找到函数的制针。
1
2
3
4
5
6
7
8
9
10
11
12
13
//People构造函数
function People(){
//Type属性
this.type = 'human';
}
//原型对象上共享的方法showType()
People.prototype.showType = function(){
alert(this.type);
}
//people实例对象
var person = new People();
//调用原型对象上的共享方法
person.showType();//output: human

None

原型链

上面说到,每个函数都有一个prototype属性,指向原型对象,可通过将该函数的prototype属性赋值为其他对象的实例,从而共享了其他对象的方法和属性,实现原型链继承。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function People(){
this.name = 'The elder';
}
People.prototype.showType = function(){
alert(this.name);
}
//Man构造函数
function Man(){
this.age = '';
this.saying = 'I\'m angry!';
}
//用People的实例对象覆盖Man的原型对象,从而使用People和Man的属性和方法
Man.prototype = new People();
//new一个Man的实例对象
var man = new Man();
//输出
console.log(man.name+': '+man.saying);//output: The elder: I'm angry!
  • 总结:和链表有一点像,重写Man的prototype属性,从而使Man的实例proto属性也改变,实现原型链。