原型与原型链
1.原型的概念
JavaScript的每个对象都继承另一个对象,后者称为“原型(prototype)”对象。
原型对象上的所有属性和方法,都会被派生对象共享。
每个对象都会在其内部初始化一个属性,就是prototype(原型)。
通俗来说,原型就是一个模板,更准确的说是一个对象模板。
实例示范1
function Student (name) {
this. name = name;
}
Student . prototype.read = function() {
alert ("读书") ;
}
var xiaoming = new Student ('小明') ;
var xiaohong = new Student('小红') ;
console.log(xiaoming.name); //小明
console.log(xiaohong .name); //小红
xiaoming.read(); //读书
xiaohong.read(); //读书
原型对象的方法不是实例对象自身的方法。只要修改原型对象,变动就立刻会体现在所有实例对象上。
实例示范2
Student .prototype.read = function(){
alert ("read") ;
}
xiaoming.read(); //read
xiaohong.read(); //read
如果实例对象自身就有某个属性或方法,它就不会再去原型对象寻找这个属性或方法。
实例示范3
xiaoming.read = function() {
alert ("阅读") ;
}
xiaoming.read(); //阅读
xiaohong.read(); //read
原型对象的作用,就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的含义,而实例对象可以视作从原型对象衍生出来的子对象。
2.原型链是什么?
当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念。简单来说就是利用原型让一个引用类型继承另一个引用类型的属性和方法。
对象的属性和方法,有可能是定义在自身,也有可能是定义在它的原型对象。由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。 比如,a对象是b对象的原型,b对象是c对象的原型,以此类推。
3.“原型链”的作用是什么?
“原型链”的作用是,读取对象的某个属性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最项层的Object.prototype还是找不到,则返回undefined。
如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖(overriding)”。
需要注意的是,一级级向上, 在原型链寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链。
4.null和undefined的区别
undefined是一个表示"无"的原始值。
null用来表示尚未存在的对象,它没有自己的原型对象。