标签:javascript
这种模式抽象创建具体对象的过程,用函数封装特定的接口来创建类。
function createStudent(name) {
var o = new Object();
o.name = name;
o.sayName = function() {
alert(this.name);
};
return o;
}
var student1 = createStudent("Tom");
解决的问题:解决了创建多个相似对象的问题
缺点:没有解决对象识别问题
function Student(name) {
this.name = name;
this.sayName = function() {
alert(this.name);
};
}
var student1 = new Student("Tom");
var student2 = new Student("Suen");
这种模式创建Student的新实例,必须使用new操作符。调用构造函数会经过如下4步骤:(1)创建一个新对象; (2)将构造函数的作用域赋给新对象(因此this就指向了这个新对象); (3)执行构造函数中的代码(为这个新对象添加属性) (4)返回新对象
解决的问题:对象识别问题,可以通过constructor属性和instanceof操作符来检测对象类型:
alert(student1.constructor == Student) //true
alert(student2 instanceof Object) //true
alert(student2 instanceof Student) //true
缺点:每个方法都要在每个实例上重新创建一遍。比如上面的例子,student1和student2的sayName()不是同一个Function的实例,这是不必要的。
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法。
function Student() {
}
Student.prototype.name = "Tom";
Student.prototype.sayName = function(){
alert(this.name);
};
var student1 = new Student("Tom");
var student2 = new Student("Suen");
alert(student1.sayName == student2.sayName); //true
更简单的原型语法:
function Student(){
}
Student.prototype = {
constructor : Student,
name : "Tom",
sayName : function() {
alert(this.name);
}
};
解决的问题:所有对象实例共享原型中方法,不需要重新创建。
缺点:它省略了为构造函数初始化参数环节,导致所有实例在默认情况下都取得相同的属性值。更严重的是原型中的属性被很多实例共享,虽然可以通过实例中添加同名属性解决,但是对于包含引用类型值的属性来说,问题就比较突出。
构造函数模式用于定义实例属性,而原型模式定义方法和共享的方法。每个实例都会有自己的一份实例属性的副本,同时又共享着对方法的引用。
function Student(name) {
this.name = name;
this.roommates = ["John","Ben"];
}
Student.prototype = {
constructor : Student,
sayName : function() {
alert(this.name);
}
};
var student1 = new Student("Tom");
var student2 = new Student("Suen");
student1.roommates.push("Jim");
alert(student1.roommates); // "John, Ben, Jim"
alert(student2.roommates); // "John, Ben"
这种模式是使用最广泛,认可度最高的模式。
javascript创建对象总结(javascript高级程序设计)
标签:javascript
原文地址:http://blog.csdn.net/pigsuper/article/details/44460207