/**
* 讲述js中类的声明及对象的创建方式
* @author cuitongxin
*/
/**
* 1、工厂方法来创建javaScript对象
* 缺点:该方法创建的实力都有一个独立的函数,而不是多个实例共用同一个函数。
*/
function createObject () {
var obj = new Object;
obj.color = "red";
obj.name = "object to object";
obj.sayName = function () {
alert(this.name);
}
return obj;
}
//采用函数指针的问题来解决共享同一个函数的问题,但是该函数看起来不像对象的方法,倒是像对象的属性
function showMsg () {
alert(this.msg);
}
function createObject2 (ss,tt,dd) {
var obj = new Object;
obj.ss = "ss";
obj.msg = tt;
obj.dd = "dd";
obj.showMsg = showMsg;
return obj;
}
/**
* 2、上面的问题引起了构造函数的出现
* 当采用 var car = new Car("sss","dddd","tt");形式来创建对象时,实际执行的步骤如下:
* (1)、首先在执行构造函数的第一行代码前,先去创建一个对象,然后把它付给当前的this指针。
* (2)、执行后面的代码为this附上属性值。
* (3)、执行完相关的操作之后,构造函数通过new 的系统操作默认返回 this对象。
*
* 缺点:构造函数仍然会为不同的实力独立的创建函数,如果采用工厂方法中的外部指针的方式,也会引起语义的问题。
*/
function Car (ss,dd,tt) {
this.ss = ss;
this.dd = dd;
this.tt = tt;
this.showMsg = function () {
alert(this.ss);
}
}
/**
* 3、原型方式
* 该方式利用了对象的prototype属性,可以把它看作创建新对象所依赖的原型。
* 当执行:var car = new Car(); 实际执行步骤如下:
* (1)、原型的所有属性都被立即的赋予要创建的所有对象。函数赋值,付的是指向函数的指针--引用。
* (2)、new 操作本身会返回要创建的对象。
*
* 缺点:
* 1、使用原型方式,不能给构造函数传递参数值。
* 2、当属性指向的是对象而不是函数时,所有的实力将共享该对象,引起并发访问的问题。
*/
function Car () {
}
Car.prototype.msg = "msg";
Car.prototype.showMsg = function () {
alert(this.msg);
}
/**
* 4、构造函数和原型的方式一起使用,来解决上面存在的问题。混合 构造函数/原型 方式
* 设计步骤:
* (1)、用构造函数来定义对象的所有非函数属性。
* (2)、用原型方式来定义对象的函数属性。
* 结果:所有的函数只创建一次,而每个对象都有属于自己的属性实例
*/
function Car (ss,dd) {
this.ss = ss;
this.dd = ss;
this.aVal = new Array("ss","dd","tt");
}
Car.prototype.showMsg = function () {
alert(this.ss);
}
/**
* 5、动态的原型方式
* 原因:考虑到和其他的语言一样把属性和方法封装在一起。
*/
function Car (dd,tt) {
this.dd = dd;
this.tt = tt;
this.aDeriver = new Array("sss","dddd");
if(typeof Car._initialized == "undefined") {
Car.prototype.showMsg = function () {
alert(this.tt);
}
Car._initialized = true;
}
}
/**
* 6、混合工厂方式
* 说明:该方式创建假的构造函数,只返回另一对象的新实例。
* 使用方式:var car = new Car(); 执行步骤:
* (1)、忽略掉外部的 new 关键字,执行内部的 new 关键字。
*/
function Car () {
var obj = new Object;
obj.ss = "ss";
obj.tt = "tt";
obj.showMsg = function () {
alert(this.tt);
}
return obj;
}