javaScript 创建对象
js创建对象有几种方法:
1: 工厂方式:如:
function createPerson(name,age){
var templete = new Object();
templete.name = name;
templete.age = age;
templete.showName = function(){
alert(this.name);
}
return templete;
}
或者将showName定义在函数的外边,
var p1 = createPerson();此种方式不合大众口味,因为,(1)不像其它面向对象构造语言一样使用new关键字来创建一个对象;(2)每次调用createPerson函数创建一个对象的时候,都会创建一次showName函数,这样每个对象都有独自的showName版本。当然如果将showName函数定义在createPerson外部,则不存在此问题。
2、构造函数方式
例子:funciton Person(name,age){
this.name = name;
this.age = age;
this.showName = function(){
alert(this.name);
}
}
此种方式仍然会在每次创建一个对象的时候都创建一个showName方法,每个对象有独自的showName版本。
3、原型方式
例子:
function Person(name,age){
}
Person.prototype.name = name;
Person.prototype.age = age;
Person.prototype.showName = function(){
alert(this.name);
}
var p = new Person("a",1);
var p1 = new Person("b",2);
p.showName(); //结果是“b”;
p1.showName(); //结果是“b”;
这种方式可以解决掉上述第二个问题,所有用new关键字创建出来的对象公用一个showName()方法,但是构造函数的prototype属性中的内容是所有对象共享的,
所以一个对象中的内容更改会影响到所有的对象,显然不符合面向对象语言的特征。
4、构造函数/原型模式混合;
例子:function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.showName = function(){
alert(this.name);
}
这种方式可以显然可以解决掉上述问题,为目前大多数程序员所使用的方式。也可以使用如下方式:
function Person(name,age){
this.name = name;
this.age = age;
if(typeOf Person._initialized == "undefined"){
Person.prototype.showName = function (){
alert(this.name);
}
}
Person._initialized = true;
}
var p = new Person();
这样将方法定义在内部,看起来更像一个面向对象的语言了。其中使用typeOf Person._initialized属性来判断是否给原型赋予了方法,确保方法只创建一次,所有对象公用一个方法。
浙公网安备 33010602011771号