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);

}

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;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值