javascript面向对象编程方式,对于初学者来说,会比较难懂. 要学会面向对象以及使用面向对象编程,理解对象的创建在内存中的表示,至关重要.

首先,我们来一段简单的对象创建代码

         var obj = new Object();
obj.userName = 'ghostwu';
obj.showUserName = function(){
return obj.userName;
};
var obj2 = new Object();
obj2.userName = '卫庄';
obj2.showUserName = function(){
return obj2.userName;
}; console.log( obj.showUserName() ); //ghostwu
console.log( obj2.showUserName() ); //卫庄

上例,我们创建了两个对象obj和obj2, 如果有多个类似对象,我们可以通过函数封装,这种函数封装方式,在设计模式里面叫工厂模式

         function createObj( uName ){
var obj = new Object();
obj.userName = uName;
obj.showUserName = function(){
return obj.userName;
}
return obj;
}
var obj1 = createObj( 'ghostwu' );
var obj2 = createObj( '卫庄' );
console.log( obj1.showUserName() ); //ghostwu
console.log( obj2.showUserName() ); //卫庄

工厂模式简化了创建多个类似对象的过程,但是却不能识别对象的类型,为了识别对象的创建类型,我们可以使用构造函数方式.

什么是构造函数方式?

其实我们js很多创建内存对象的方式 都是构造函数方式,如,数组: var arr = new Array ( 5 ),  时间对象: var date = new Date()

函数前面带上new关键字,是构造函数的外在表现

         function CreateObj( uName ){
this.userName= uName;
this.showUserName = function(){
return this.userName;
}
}
var obj1 = new CreateObj( 'ghostwu' );
var obj2 = new CreateObj( '卫庄' ); console.log( obj1.showUserName() ); //ghostwu
console.log( obj2.showUserName() ); //卫庄

首先,明确几个事实:

  • 任何函数前面都可以用new关键字
  • 如果用了new关键字, 函数中的this指向的是 创建出来的对象, obj1造出来的时候,this指向的就是obj1, obj2造出来的时候,this指向的就是obj2.
  • 构造函数把属性和方法直接赋值给this, 不需要创建一个对象( new Object() )
  • 构造函数会自动return this
  • 每new一个函数, 就会在内存中,生成一个独立的内存区域,用来存储当前的对象,以及对象上面的方法和属性

如果构造函数前面不用new去掉用,函数中的this指向的是window, 相当于给window加属性和方法,函数没有返回值,就是undefined

obj1 = CreateObj( 'ghostwu' );
obj2 = CreateObj( '卫庄' );
console.log( obj1 ); //undefined
console.log( obj2 ); //undefined
 
那向下面这样调用,就会报错
console.log( obj1.showUserName() ); //报错
console.log( obj2.showUserName() ); //报错
 
因为obj1和obj2都是undefined,showUserName被加到windows对象上了
 

最新文章

  1. vim 分屏显示
  2. Apache按日切分日志
  3. Linux命令大全----常用文件操作命令
  4. 从Maya中导入LightMap到unity中
  5. XMLHttpRequest cannot load – Origin is not allowed by Access-Control-Allow-Origin.
  6. hdu 4612 Warm up 桥缩点
  7. 一些dos命令
  8. html-----011--子窗体iframe
  9. docker-compose.yml 语法说明
  10. POJ 2318 TOYS(计算几何)
  11. HTML5绘制矩形和圆形并且还有获取在这个图层内的坐标的思路和代码 - feilong_12的专栏 - 博客频道 - CSDN.NET
  12. selenium之 驱动环境配置chrome、firefox、IE
  13. windows系统下用python更新svn和Git
  14. [Swift]LeetCode496. 下一个更大元素 I | Next Greater Element I
  15. shell中的数据生命周期scope
  16. RabbitMQ全网资料收集
  17. iOS 键盘上方增加工具栏
  18. M600 (1)飞行注意事项
  19. PS火焰文字制作
  20. WebKit的Platform接口部分

热门文章

  1. Apache的作用及意义
  2. select2 4.0.3 空记录时的处理
  3. docker~学习笔记索引
  4. React Native App设置&Android版发布
  5. Android - 传统蓝牙(蓝牙2.0)
  6. Android - AIDL 使用
  7. nyoj_471:好多的树(容斥原理)
  8. 智慧航空AI大赛-阿里云算法大赛总结 第一赛季总结
  9. 那些年,用C#调用过的外部Dll
  10. [补档][Poi2010]Monotonicity 2