1、原始模式
var Cat = {
name : '',
color : ''
}
var cat1 = {}; // 创建一个空对象
cat1.name = "大毛"; // 按照原型对象的属性赋值
cat1.color = "黄色";
这样有两个缺点,一是如果生成多个实例,写起来很麻烦,二是实例与原型看起来没有什么联系。
2、改进
function Cat(name,color) {
return {
name:name,
color:color
}
}
var cat1 = Cat("大毛","黄色");
这样解决了代码重复问题,但还是不能反映出他们是同一个原型对象的实例。
3、再改进,构造函数模式:
function Cat(name,color){
this.name=name;
this.color=color;
}
var cat1 = new Cat("大毛","黄色");
var cat2 = new Cat("二毛","黑色");
这时cat1和cat2会含有一个constructor属性,指向他们的构造函数。
alert(cat1.constructor == Cat); //true
4、再改进,prototype模式:
构造函数模式有一个弊端,有一些共用的属性和方法,每次生成一个实例,都会重复生成,造成内存浪费。
直到现在的prototype模式:没一个构造函数都有一个prototype属性,指向另一个对象,这个对象的所有属性和方法,都会被构造函数的实例继承。
所以共用的属性和方法,可以定义在prototype对象上。
cat.prototype.type=“猫科动物”;
Cat.prototype.eat = function(){alert("吃老鼠")};
alert(cat1.type); // 猫科动物
------------------------------------------------------------继承--------------------------------------------------------------
function Animal(){
this.species = "动物";
}
function Cat(name,color){
this.name = name;
this.color = color;
}
cat如何继承animal?
prototype模式
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
var cat1 = new Cat("大毛","黄色");
alert(cat1.species); // 动物
每个prototype对象都有一个constructor属性,指向它的构造函数。