一、示例说明
/*
普通函数与构造函数本质上没有任何区别,只是我们调用的方式不同而已,关键在于一个字 new。
调用构造函数:newfunction_name();
调用普通函数:function_name();
在函数中有一个this对象,this始终代表该函数的调用者。
如果是构造函数,this就是构造出来的新对象。
如果是普通函数,this就是 window 对象。
如果使用new关键字调用,那么函数的 return 语句不再起作用,因为这时还回的是 this 对象
*/
var Book = function (name, price) {
this.name = name;
this.price = price;
if (this == window) {
return "name = " + name;
} else {
alert("this book price is " + this.price);
}
}
var result = Book("java", 100);//this 指向window
alert(result);
var book = new Book("c#", 120);
二、动态添加属性
//动态添加属性
function Foo(){
this.name="Foo";
}
var obj = new Foo();
obj.name = "Foo1";
alert("name:"+obj.name);
三、简单对象创建方式比较:
1.简单方式
var person = new Object();
person.name = “LL”;
person.age = 22;
问题:创建多个相似对象,大量重复代码
2、 工厂模式
function Person (name,age){
var o = new Object();
o.name = name;
o.age = age;
o.getName=function(){
alert(this.name);
}
return o;
}
var person1 = new Person(“LL”,22);
person1.getName() ; //”LL”
(1)根据接受的参数来构建一个包含所有必要信息的Person对象,多次调用,每次返回一个包含两个属性和一个方法的对象。
(2)优点:解决了创建多个相似对象的问题
问题:对象识别的问题,即怎样知道一个对象的类型
解决:构造函数
3、原型模式
function Person(){
}
Person.prototype.age = 20;
Person.prototype.name = "xiao wang";
Person.prototype.hobby = new Array("sport","swiming");
var p1 = new Perosn();
var p2 = new Person();
p1.hobby.push("football");
alert(p1.hobby); //output: sport,swimming,football
alert(p2.hobby); //output sport,swimming,football
原型方式有个很严重的问题就是当属性指向的是对象时,如数组,这里由于数组的引用值,Person的两个对象指向的都是同一个数组,所以当在p1添加值后,在p2中也可以看到。
联合是用构造函数/原型方式就可以像其他程序设计语言一样创建对象,是用构造函数定义对象的非函数属性,用原型方式定义对象的方法,使用
function Person (){
this.hobby = new Array("sport","swiming");
}
Property.prototype.showName = fucntion(){
alert(this.name);
}
Person.prototype.name = "xiao wang";
var p1 = new Perosn();
var p2 = new Person();
p1.hobby.push("football");
alert(p1.hobby); // output: sport,swimming,footballalert(p2.hobby); // output sport,swimming
4、 构造函数模式
this.name = name;
this.age = age;
this.getName = function(){
alert(this.name);
};
}
var person1 = new Person(“LL”,22);
1)与工厂模式比较
a.没有显示的创建对象;
b.直接将属性和方法赋值给this对象;
c.没有return语句;
d.将实例标识为一种特定的类型(instanceof);
(2)构造函数与普通函数区别
a.习惯:构造函数始终一个大写字母开头,非构造函数以一个小写字母开头
b.唯一区别:调用方式不同,用new调用为构造函数,不用new为普通函数