什么是原型属性,原型对象
Javascript中每个函数都有一个prototype(原型)属性,这个属性指向一个对象(原型对象),这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
结论:使用原型对象可以让所有实例共享它的属性和方法
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
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 => person1和person2调用的是同一个方法的实例
原型对象的理解:
只要创建一个新函数,js会根据特定规则为这个函数生成一个prototype属性(原型属性),这个属性值是一个指针,指向这个函数的原型对象。默认情况下,原型对象会自动获取一个constructor属性,这个属性值是一个指针,指向prototype所在函数。
当调用构造函数创建一个新实例后,该实例内部将包含一个内部属性([[prototype]]),指向构造函数的原型对象。这个内部属性[[protype]] 没有标准的方式来访问,不同浏览器的实现方式可能不一样。Chrome,Firefox通过__proto__这个属性可以访问,一般称实例的__proto__为隐式原型 ,函数的prototype为显式原型
以上图Person为例,Person构造函数默认会有一个prototype属性,这个属性指向一个对象,称为构造函数的原型对象,该原型对象默认情况下会有一个constructor属性,这个属性值是一个指针,指向Person()这个函数。
person1通过new Person()创建了一个实例,这个 实例默认会有一个内部属性[[Prototype]],这个内部属性值是一个指针,指向函数的原型对象,这个内部属性在Chrome中可通过person1.__protype__访问到。
一旦创建实例后,实例就可以访问原型对象中的属性和方法。
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
实例和函数不会直接关联,实例与函数的原型对象直接连接
Example:
function test() {
this.Name = 'henry';
this.Age = 25;
}
test.prototype.Tall = 180;
test.prototype.getprovince = function () {
return '宇宙苏';
}
var fn = new test();
console.log(fn.Name);//henry
console.log(fn.Age);//25
console.log(fn.Tall);//180
console.log(fn.getprovince());//宇宙苏
//__proto__:隐式原型 prototype:显式原型
console.log(fn.__proto__ === test.prototype);//true