1.关于对象
1.原始模式
var person = new Object();
person.name="Jack";
person.age=29;
person.message=function ()
{
alert(this.name+" is "+this.age);
};
alert(person.name);//Jack
person.message();//Jack is 29
2.创建对象
分为三种模式:
(1)工厂模式:
function Person(name,age,hobby){
var a= new Object();//在函数中创建一个类
a.name=name;
a.age=age;
a.hobby=hobby;
a.message=function (){
alert(this.name+" is "+this.age);
};
return a;//将这个值作为返回值返回回去
}
var person=Person("Jack",29,"swimming");//通过实例化一个类
person.message();//Jack is 29
当时也许工厂模式解决了大量相似对象创建的问题,通过调用一个函数进行传值,并返回一个对象,但是随着javascript的发展,其也出现了弊端,无法识 别对象,随后便有了构造函数
(2)构造函数
function Person(name,age,hobby){
this.name=name;
this.age=age;
this.hobby=hobby;
this.message=function (){
alert(this.name+" is "+this.age);
};
}
var person=new Person("Jack",29,"swimming");
var person2=new Person("David",28,"running");
person.message();//Jack is 29
构造函数和工厂函数最大的区别:
(1)不需要在函数内再创建一个类,也不需要显式地创建对象
(2)没有return一个对象回去
(3)所有的属性和方法直接给this,而this的指针指向的是person
(4)补充:构造函数与其他函数最大的区别是调用方法不同,构造函数需要通过new操作符来调用
接下来通过测试person和person2的属性来确定其比工厂函数好的地方:
person.constructor==Person;//true
person2.constructor==Person;//true
然后用instanceof测试:
person instanceof Person;//true
person instanceof Person;//true
可见构造函数可以将其实例视为一种特定类型,而工厂函数并未做到
缺点:
person.message==person2.message;//false
这代表什么嘞?
当构造函数有方法和属性都是一模一样的内容时,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。
为此原型很好的解决了这个问题。
3.原型(prototype)模式
function Person(){
}
Person.prototype.name="Jack";
Person.prototype.age=29;
Person.prototype.hobby="swimming";
Person.prototype.message=function (){
alert(this.name);
};
var person=new Person();
var person2=new Person();
alert(person.message==person2.message);//true
这次原型模式解决了构造函数所存在的问题
不过原型模式虽然很好的节约了内存的问题,但是其还是有问题的:
function Fruit(){
}
Fruit.prototype={
name:"Jack",
age:29,
likeFruit:["apple","mango"]
};
var person=new Fruit();
var person2=new Fruit();
person.likeFruit.push("lemon");
person2.likeFruit.push("banana");
alert(person.likeFruit);//apple,mango,lemon,banana
alert(person2.likeFruit);//apple,mango,lemon,banana
alert(person.likeFruit===person2.likeFruit);//true
为什么给person加的值,在person2也会出现?
而且两个类的值是相同的,这便是原型函数的问题
所以一般将两者组合起来使用:function Person(name,age,hobby){
this.name=name;
this.age=age;
this.hobby=hobby;
this.likeFruit=["apple","mango"];
}
Person.prototype={
message : function (){
alert(this.name);
}
}
var person =new Person("Jack",29,"swimming");
var person2=new Person("David",28,"running");
person.likeFruit.push("lemon");
alert(person2.likeFruit);//apple,mango
person.message();//Jack
person2.message();//David
这样就可以规避上面出现的一些问题
上面知识是自己通过看书和自己归纳的,自己归纳地可能有些会有不太准确的,这个也是自己第一次写博客,许多功能还不会用,希望得到大家指点,谢谢