在学习原型和原型链的时候,我们首先要知道,数组,函数,对象都是可以自由的去拓展属性的,它们都有一个属性叫__proto__,这个属性我们一般称之为隐式原型(就是一个普通的对象);所有的函数都有一个prototype的属性,一般我们称之为显示属性(一个普通的对象);在数组,函数,对象中,他们的__proto__属性都是指向他的构造函数的prototype属性,在需要找到对象的一个属性的时候,但是在该对象中我们没要找到该对象的这个属性的时候,这个时候就会向__proto__属性中去找.
原型实例:
// 构造函数
function Person(name ,age){
this.name = name;
this.age = age;
}
// 因为我们可以自由的通过prototype去扩展对象的属性(null除外)
Person.prototype = {
sayHello: function() {
console.log('hello,我是' + this.name+',我今年'+this.age+'岁了!');
}
sayHi: function() {
console.log('hi,我是' + this.name+',我今年'+this.age+'岁了!');
}
}
// 当试图去找一个对象的属性时,若是对象的属性不存在,那么就会去他的构造函数的prototype属性中去找
var p1 = new Person('小明',18);
p1.sayHello();// hello,我是小明,我今年18岁了!
p1.sayHi();// hi,我是小明,我今年18岁了!
// 通过对原型的使用可以使得不比在每次创建Person对象的时候,将所有的属性都创建出来,这样可以为我们节省下很多的资源.
原型链详解:
// 若是理解了原型的话,那么对于原型链的话,理解起来也就比较简单了,首先我们是知道当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它构造函数的’prototype’属性中去寻找,因为’prototype’属性是一个对象,所以它也有一个’_ _ proto_ _'属性。
所以就会延伸出下图,原型链
p1的构造函数是Person(), 所以Person.prototype === p__proto__,Person.prototype是一个对象,它会继承跟对象Object,Object也是一个对象, Person.prototype.__proto__ === Object.prototype,Object.prototype中有toString()方法,所以我们在通过p1来调用toString()这个方法时,先去Person.prototype中去找,发现没有,然后去Object.prototype中去找,找到了,就调用Object.prototype中的toString()方法。因为Object是所有对象的父亲,所以Obj.__proto__.__proto__ === null .这就是原型链(只能单向的从p1->object,即只能从下往上找).
理解原型链一定要先理解原型和继承,这样可以很快的知道原型链是什么了.