日期:2014-05-16  浏览次数:20363 次

JavaScript 原理详解之类声明及对象创建

/**

?* 讲述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);

}