原型
原型是什么?我想每个人被问到的时候都会静下来思考,尽管已经过了这么多年了,也有很多专家学者说出了自己的理解,但是还是会觉得很难睡服他人。在我看来原型就是一个特殊的对象,其他对象可以通过它实现属性的继承,也就是说它就像Java中的抽象类一样。
简洁的原型语法:
Person.prototype = {
name:"Jack",
age:33,
job:"Software Engineer",
sayName:function(){
console.log(this.name);
}
}
原型链
为了便于理解,先上代码为敬。
function Person(){ //Person实例
this.pName = "Jack";
this.pAge = 22;
this.pJob = "Software Engineer";
}
Person.prototype.sayPersonName = function(){ //Person原型方法
return "The person's name is " + this.pName;
};
function Man(){ //Man实例
this.mName = "Greg";
this.mAge = 33;
this.mJob = "Doctor"
}
Man.prototype = new Person() //将Person的实例赋给Man的原型
Man.prototype.sayManName = function(){ //创建Man原型方法
return "The man's name is " + this.mName;
};
var people = new Man(); //将Man的实例赋给people
console.log(people.sayPersonName()); //The person's name is Jack
console.log(people.sayManName ()); //The man's name is Greg
上面的即为一个简单的原型链,people是Man的实例,Man的原型是Person的实例,
而Person又有自己的原型。之所以people.sayPersonName()的结果是那样是因为在Person原型中可以找到这个函数,因而可以调用,另一个结果也是如此。他们都存在同一条链上,如果构造函数Person和Man中的属性名一致的话会导致Person对象中的属性和方法全部被覆盖,即使将属性放在原型中也是如此。那么展示的名字会变得一样。
属性查找
当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止,到查找到达原型链的顶部 - 也就是 Object.prototype - 但是仍然没有找到指定的属性,就会返回 undefined。
function Sum(){
this.add = function(x,y){
return x + y;
}
}
Sum.prototype = { //这种格式少用
add:function(x,y){
return x + y + 10;
}
}
Object.prototype.subtract = function(x,y){
return x - y;
}
var func = new Sum();
console.log(func.add(2,1)); //返回3,不是13
console.log(func.subtract(2,1)); //返回1
add方法并没有按照原型中的方法来取得值,属性在查找的时候是先查找自身的属性,如果没有再查找原型,再没有,再往上走,一直查到Object的原型上。还有一点subtract()方法不像Sum原型中的add方法的原因应该是Object存在原型,我们只能在它内部添加方法和属性,而无法去定义它。(在原型已经存在之后不要再使用字面量添加新属性和方法)