1.原型(prototype)和构造函数之间的关系
每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象(函数的原型对象),而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
原型对象默认只会取得constructor属性,其他方法,则都是从Object继承而来的。
当调用的构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性,[[Prototype]]),指向构造函数的原型对象。
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true
2.对象实例和原型对象属性名称相同,找的是哪个?(添加的属性只会阻止我们访问原型中的属性,但不会修改属性)
先从对象的实例本身开始搜索。如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。如果在原型对象中找到了这个属性,则返回该属性的值
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
person1.name = "Greg";
alert(person1.name); //"Greg"
alert(person2.name); //"Nicholas"
3.原型的动态性
原型对象所做的任何修改都能够立即从实例上反映出来
var friend = new Person();
Person.prototype.sayHi = function(){
alert("hi");
};
friend.sayHi(); //"hi"
重写原型对象,(P156)