您的位置:首页 > Web前端 > JavaScript

js 创建对象的几种方式

2014-08-14 14:52 453 查看
创建对象
1、工场模式
缺点无法解决对象识别的问题
function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = fucntion(){
alert(this.name);
}
retrurn o;
}
var person1 = createPerson("Nicholas",22,"Engineer");
var person2 = createPerson("Nicholas",35,"Engineer");

2、构造函数模式
与工厂模式不同:
A 没有显示创建对象
B 直接将属性和方法赋值给了 this 对象
C 没有 return 语句
D 构造函数有 constructor(构造函数) 属性,该属性指向 Person,这个属性最初是用来标识对象类型的
E 另外,构造函数也是函数,任何函数使用 new 那么就可以作为构造函数,不通过 new 来调用那么它就是普通函数
缺点:
A 每个方法在进行实例化的时候都会创建一遍
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = fucntion(){
alert(this.name);
}
}
var person1 = new Person("Nicholas",22,"Engineer");
var person2 = new Person("Nicholas",35,"Engineer");
alert(person1.constructor == Person);	// true
alert(person2.constructor == Person);	// true
alert(person1.sayName ==  person2.sayName)	// false

3、原型模式
我们创建的每一个函数都有一个 prototype (原型) 属性,这个属性时一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。
function Person(){
}
Person.prototype.name = "Tom";
Person.prototype.age = 29;
Person.prototype.job = "Teacher";
Person.prototype.sayName = function(){
alert(this.name)
};
var person1 = new Person();
var person2 = new Person();
alert(person1.sayName ==  person2.sayName)	// true

更简单的原型语法
不过这种方法因为是字面量创建对象,而不是函数,不是函数的话没有 constructor 属性,使用字面量创建对象的时候就没有该属性,
所以一般字面量都会把 constructor 属性给加上。
function Person(){
}

Person.prototype = {
constructor : Person,
name : "Tom",
age : 29,
job : "Teacher",
sayName :  function(){
alert(this.name);
}
}

4、组合使用构造函数模式和原型模式
构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结果每个实例都会有自己的一份实例属性副本,但是又共享者对方法的引用。最大限度节省内存。
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["A","B","C"];
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}

5、动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayName != "function"){
Person.prototype.sayName = fucntion(){
alert(this.name);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息