//定义一个apple对象的构造函数 function Apple{ this.color='red'; } //创建一个apple对象 var apple1 = new Apple(); //我还可以这么创建apple对象 var apple2 = { color:'red'; } 这两个apple对象在内存中都是完全一样的。只不过js提供了两种创建方式而已。
1、工厂方式:
function createCar(colors,doors){ var tempCar = new object(); tempCar.colors = colors; tempCar.doors = doors; tempCar.showColor = function showColor(){ alert(this.color); }; }
缺点:不像常用的面向对象声明的方式;每声明一个Car实例,就要创建多一个showColor函数,不能复用,浪费内存 。
2、构造函数的方式:
function Car(colors,doors){ this.colors = colors; this.doors = doors; this.showColor = function showColor(){ alert(this.color); }
优点:以更面向对象的方式
缺点:每声明一个Car实例,就要创建多一个showColor函数,不能复用,浪费内存。
3、prototype原形的方式:
//首先定义构造函数
function Car(){ } Car.prototype.colors = "red"; Car.prototype.doors = 4; Car.prototype.showColor = function(){ alert(this.colors); };
//以上面的定义原形创建Car
var car1 = new Car();
var car2 = new Car();
优点:重用代码,car1.showColor,car2.showColor指向的是同一个函数位置。
缺点:构造函数没有参数,不能在调用构造函数时,自定义自己的Car。
注:这个缺点可以这样解决:var car1 = new Car();声明后,再指定它自己的字段和方法:car1.doors = 6;
也可以改变方法指针指向另一个方法:car1.showColor = changeColor;
综合解决以上问题的方法:
4、联合使用构造函数和原形方式:
function Car(colors,doors){ this.colors = colors; this.doors = doors; } Car.prototype.showColor = function showColor(){ alert(this.color); }; var car1 = new Car("red",4); var car2 = new Car("blue",6);
优点:这样一来便很好地解决了上面的问题,在调用构造函数时,自定义自己的Car;也解决了方法复用的问题。
prototype就是“一个给类的对象添加方法的方法”,使用prototype属性,可以给类动态地添加方法。
当你用prototype编写一个类后,如果new一个新的对象,浏览器会自动把prototype中的内容替你附加在对象上。这样,通过利用prototype就可以在JavaScript中实现成员函数的定义,甚至是“继承”的效果。
http://blog.csdn.net/xiaoyuemian/archive/2009/01/20/3844305.aspx
function Hotel () { this.hotelName = ""; this.hotelId = ""; this.star = ""; this.city = ""; this.zone = ""; this.rooms = []; } // get and set zone Hotel.prototype.setZone = function (zone) { this.zone = zone; }; Hotel.prototype.getZone = function () { return this.zone; }; Hotel.prototype.setRooms = function (room) { this.rooms[this.rooms.length] = room; }; Hotel.prototype.getRooms = function (idx) { return (idx >= 0 && idx < this.rooms.length) ? this.rooms[idx] : ""; };
1、
for(var i=0; i<recordList.length; i++){ fileCtrl.addFileList.push(recordList[i]); fileCtrl.currFileList.push(recordList[i]); } alert(JSON.stringify(fileCtrl));
2、
var fileObjArr = []; var length = _tr.length; _tr.not(":first").each(function(i){ var qFile = new EipQuestionFile(); qFile.setFileCode(filecode); qFile.setRemark(remark); fileObjArr[fileObjArr.length] = qFile; }); $("#uploadFileList").val(JSON.stringify(fileObjArr)); //否则无法讲其作为Str传输过去 function EipQuestionFile(){ this.fileCode = ''; this.remark = ''; } EipQuestionFile.prototype.setFileCode = function (fileCode) { this.fileCode = fileCode; }; EipQuestionFile.prototype.setRemark = function(remark){ this.remark = remark; }
..