JS是一种基于对象的语言,和其他面向对象语言不同
对象
1、引用类型是一种数据结构,将数据和功能组织在一起,常被成为类
2、某个特定引用类型的实例
3、引用类型&对象–模具&实例
属性和方法
ECMA定义对象
对象是无序属性的集合,其属性可以包含基本值,对象或函数
对象:属性,方法
属性–变量
方法–函数
This
window对象(默认的this)
属性和方法属于谁
当前对象
属性和方法属于谁,谁就是this
this实例:
var date=new Date();
date.name=’我是日期’;
date.show=function(){
// document.write(date.name+”< br/>”);这里的date可以写成this,表示当前对象的属性
document.write(this.name+”< br/>”);
}
date.show();
输出结果—我是日期
创建对象Object
ECMAScript提供的一种原生引用类型
可以通过Object引用类型的实例创建一个对象
可以为对象定义属性和方法
Object实例本身不具备多少功能,一般在应用程序中存储和传输数据
创建对象实例:
var user=new Object();
user.name=’张三’;
user.pwd=’123456’;
user.funa=function(){
document.write(this.name+’-‘+this.pwd+’< br/>’);
}
user.funa();
输出结果—张三-123456
对象字面量
对象定义的一种简写形式
简化创建包含大量属性的对象的过程
在为函数传递大量可选参数时,可考虑使用字面量
创建对象实例:
第一种方法:
var usera={
name:’张三’,
pwd:’123456’,
funb:function(){
document.write(this.name+’-‘+this.pwd+’< br/>’);
}
}
usera.funb();
第二种方法:和Object定义对象等价
var userc={};
userc.name=’张三’;
userc.pwd=’123456’;
userc.func=function(){
document.write(this.name+’-‘+this.pwd+’< br/>’);
}
userc.func();
第一种方法输出结果—张三-123456
第二种方法输出结果—张三-123456
工厂模式
软件工程领域的一种设计模式
抽象了创建对象的过程
通过函数封装创建对象的细节
工厂模式弊端:看不出数据类型,函数重复,浪费资源
工厂模式优化对象实例:
function cuser(name,pwd){
var userp=new Object();
userp.name=name;
userp.pwd=pwd;
userp.funap=function(){
document.write(this.name+’-‘+this.pwd+’< br/>’);
}
return userp;
}
var user1=cuser(‘张三’,’123456’);
var user2=cuser(‘张三2’,’123456’);
user1.funap();
user2.funap();
输出结果—张三-123456,张三2-123456
工厂模式弊端解决
构造函数
构造函数一般以大写字母开头
构造函数也是函数,只不过可以用来创建对象
与工厂模式对比
没有显示创建对象
直接将属性和方法赋给了this对象
没有return
原型prototype
每个函数都有一个prototype(原型)属性
是一个指针,指向一个对象
这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法
用混合方式构造函数
构造函数+prototype
构造函数:属性
原型prototype:方法
解决弊端实例:
1、看不出类型:解决方式:构造函数:属性
//创建一个新对象,将属性和方法为新对象赋值,将新对象返回
function Hcuser(name,pwd){
this.name=name;
this.pwd=pwd;
this.funap=function(){
document.write(this.name+’-‘+this.pwd+’< br/>’);
}
}
var user1=new Hcuser(‘张三’,’123456’);
var user2=new Hcuser(‘张三2’,’123456’);
user1.funap();
user2.funap();
2、函数重复,浪费资源:解决:原型prototype:方法
function Kuser(name,pwd){
this.name=name;
this.pwd=pwd;
}
Kuser.prototype.kkfun=function(){
document.write(this.name+’-‘+this.pwd+’< br/>’);
}
var user1=new Kuser(‘张三’,’123456789’);
var user2=new Kuser(‘张三2’,’123456789’);
user1.kkfun();
user2.kkfun();
document.write(user1.kkfun==user2.kkfun);
1输出结果—张三-123456,张三2-123456
2输出结果—张三-123456789,张三2-123456789
true