+++++++++++++++++++++++++++++++++++++++
创建对象 ++
+++++++++++++++++++++++++++++++++++++++
1.工厂模式: //不能识别对象类型
function Person(name,age,job){
var o= new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
}
return o;
}
实例化
var person1=Person("loo","24","Software Engineer");
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
2.构造函数模型:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
//创建实例;
var person1=new Person("loo","24","Software Engineer");
var person2=new Person("ho","24","Software Engineer");
//调用方法
person1.sayName(); //"loo"
person2.sayName(); //"ho"
alert(person1.sayName==person2.sayName); //false;
//可以发现person1和person2中的方法是不同的。即实现相同任务,在不同实例中,
//虽然使用的是构造函数中的同一方法,但是这个方法在每个实例中是不一样的;
//这是因为每次实例时,都会重新新建这个方法(可以初始化构造函数的原型===参见动态原型模式)
//
/*构造函数模式:每个实例都具有一个constructor属性指向构造函数,在此例中,
*person1和person2 的constructor均指向Person。
* person1和person2 即是Object的实例,又是Person的实例。
*/
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
3.原型模式:
function Person(){
Person.prototype.name="loo";
Person.prototype.age=24;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
};
}
//实例化
var person1=new Person();
var person2=new Person();
alert(person1.sayName==person2.sayName); //true
/*每个创建的函数都有一个原型属性(prototype),
*prototype属性指向它的原型对象,
*原型对象又具有一个constructor属性,这个属性指向构造函数;
*实例后,每个实例包含一个内部指针[[prototype]]指向原型对象。
*
*实例的属性和方法的查找:从实例开始查找,在实例自身上没有找到,就往上到原型对象上查找。
*实例的属性和方法的添加:
*原型模式就是将所有属性和方法添加到构造函数的prototype属性上,
*也就是说构造函数是一个空函数
*
*原型模式所创建的方法和属性都是共享的,对于方法来说,这是极好的,
*默认情况下,新创建的实例都具有相同的属性和方法,对于包含基本类型值的属性,
*可以通过修改使其拥有与其他实例不同值的属性(主要是阻止属性向原型对象上查找),
*但对于包含引用型值的属性,比如属性的值是一个数组,
*若改变单个实例上的属性值,则会改变原型对象上的属性值。
* 这是原型模式的缺点所在
*
*!!!!!可以先重写原型,再创建实例,但是如果已经创建了实例,再通过字面量重写原型,
*会切断已经存在的实例与新原型的联系!!!!!
*/
//确定属性是属于实例还是原型;
function hasPrototypeProperty(object,name){
return !object.hasOwnProperty(name)&&(name in object);
}
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
4.构造与原型的组合模式(应用最多的对象创建模式)
//使用构造函数模式定义实例属性;而使用原型模式定义方法和共享的属性
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["a","b"];
}
Person.prototype={
constructor : Person,
sayName : function(){
alert(this.name);
}
}
//创建实例;
var person1=new Person("loo","24","Software Engineer");
var person2=new Person("ho","24","Software Engineer");
person1.friends.push("c");
alert(person1.friends); // a,b,c
alert(person2.friends); //a,b
alert(person1.sayName==person2.sayName); //true
创建对象 ++
+++++++++++++++++++++++++++++++++++++++
1.工厂模式: //不能识别对象类型
function Person(name,age,job){
var o= new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
}
return o;
}
实例化
var person1=Person("loo","24","Software Engineer");
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
2.构造函数模型:
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
//创建实例;
var person1=new Person("loo","24","Software Engineer");
var person2=new Person("ho","24","Software Engineer");
//调用方法
person1.sayName(); //"loo"
person2.sayName(); //"ho"
alert(person1.sayName==person2.sayName); //false;
//可以发现person1和person2中的方法是不同的。即实现相同任务,在不同实例中,
//虽然使用的是构造函数中的同一方法,但是这个方法在每个实例中是不一样的;
//这是因为每次实例时,都会重新新建这个方法(可以初始化构造函数的原型===参见动态原型模式)
//
/*构造函数模式:每个实例都具有一个constructor属性指向构造函数,在此例中,
*person1和person2 的constructor均指向Person。
* person1和person2 即是Object的实例,又是Person的实例。
*/
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
3.原型模式:
function Person(){
Person.prototype.name="loo";
Person.prototype.age=24;
Person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
alert(this.name);
};
}
//实例化
var person1=new Person();
var person2=new Person();
alert(person1.sayName==person2.sayName); //true
/*每个创建的函数都有一个原型属性(prototype),
*prototype属性指向它的原型对象,
*原型对象又具有一个constructor属性,这个属性指向构造函数;
*实例后,每个实例包含一个内部指针[[prototype]]指向原型对象。
*
*实例的属性和方法的查找:从实例开始查找,在实例自身上没有找到,就往上到原型对象上查找。
*实例的属性和方法的添加:
*原型模式就是将所有属性和方法添加到构造函数的prototype属性上,
*也就是说构造函数是一个空函数
*
*原型模式所创建的方法和属性都是共享的,对于方法来说,这是极好的,
*默认情况下,新创建的实例都具有相同的属性和方法,对于包含基本类型值的属性,
*可以通过修改使其拥有与其他实例不同值的属性(主要是阻止属性向原型对象上查找),
*但对于包含引用型值的属性,比如属性的值是一个数组,
*若改变单个实例上的属性值,则会改变原型对象上的属性值。
* 这是原型模式的缺点所在
*
*!!!!!可以先重写原型,再创建实例,但是如果已经创建了实例,再通过字面量重写原型,
*会切断已经存在的实例与新原型的联系!!!!!
*/
//确定属性是属于实例还是原型;
function hasPrototypeProperty(object,name){
return !object.hasOwnProperty(name)&&(name in object);
}
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
4.构造与原型的组合模式(应用最多的对象创建模式)
//使用构造函数模式定义实例属性;而使用原型模式定义方法和共享的属性
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["a","b"];
}
Person.prototype={
constructor : Person,
sayName : function(){
alert(this.name);
}
}
//创建实例;
var person1=new Person("loo","24","Software Engineer");
var person2=new Person("ho","24","Software Engineer");
person1.friends.push("c");
alert(person1.friends); // a,b,c
alert(person2.friends); //a,b
alert(person1.sayName==person2.sayName); //true