<script>
//创建对象的方式1:基于对象的扩充其属性和方法。
var s=new Object();
s.name="zhangsan";
s.age=20;
s.say=function(){
alert(this.name+": "+this.age);
}
s.say();
//创建方式2:基于工厂方式创建(带参数的),最常用的。相当于构造函数
/* function createObject(name,age){
var s1=new Object();
s1.name=name; //要是不带参数可以写成s1.name="zhangsan"
s1.age=age; //要是不带参数的工厂方式,则可写成s1.age=20;
s1.say=function(){
alert(this.name+": "+this.age);
}
return s1;
}
*/
//下面这个函数对象为多个对象所共享(函数对象的定义写在构造函数外),而不是每个对象拥有一个函数对象(函数对象写在工厂方法内)
//这种方法是比上面的创建方法要好的。定义对象和定义对象方法时,二者分开定义。
function say(){
alert(this.name+": "+this.age);//谁调用这个方法,this指代谁。
}
function createObject(name,age){
var s1=new Object();
s1.name=name; //要是不带参数可以写成s1.name="zhangsan"
s1.age=age; //要是不带参数的工厂方式,则可写成s1.age=20;
s1.say=say;//调用多个对象共享的方法函数。
return s1;
}
var ob1=createObject("lisi",28);
ob1.say();
var ob2=createObject("zhaoliu",30);
ob2.say();
//创建方式3:构造函数式。
function person(name,age){
//在执行第一行语句前,js引擎会自动为我们创建一个对象
this.name=name; //要是不带参数可以写成s1.name="zhangsan"
this.age=age; //要是不带参数的工厂方式,则可写成s1.age=20;
//this.say=say;//调用多个对象共享的方法函数。
this.say=function(){
alert(this.name+": "+this.age);
}
//构造函数内隐藏有一个return返回语句,用语将刚才创建的对象返回
}
var p1=new person("zhangsan",29);//注意和工厂方式的不一致。
p1.say();
//创建方式4:原型方式prototype.
//无法再构造函数中为对象属性赋值。只能生成后再赋值。
//使用原型方式创建的所有对象,会共享原型中的属性,一个对象对属性的改变,会影响到其他对象的该属性。
function animal(){
}
// animal.prototype.name="lisi";
animal.prototype.name=new Array();
animal.prototype.age=20;
animal.prototype.say=function(){
alert("我是animal对象。"+this.name+": "+this.age);
}
var a=new animal();
a.name.push("animal1");
a.name.push("animal2");
a.age=10;
a.say();
var a2=new animal(); //则a2的name属性和a的一样。
a2.say();
</script>