ECMAScript是中没有类的概念,ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。
Object构造函数方法
创建自定义对象的最简单方式就是创建一个 Object 的实例,然后再为它添加属性和方法。这里的Object实际上是默认的构造函数
var zw=new Object();
zw.name="zw";
zw.age=20;
zw.job="student";
zw.getName=function(){
console.log(this.name);
}
zw.getName();//zw
使用字面量方法创建对象
字面量用来为变量赋值时的常数量
对象字面值是封闭在花括号对({})中的一个对象的零个或多个”属性名:值”列表。
var zw={
name:"zw",
age:20,
job:"student",
getName:function(){
console.log(this.name);
}
}
console.log(zw);//{name: "zw", age: 20, job: "student", getName: ƒ}
控制台依次输出zw的属性和值,getName:f表示getName是一个函数。
虽然 Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码。
工厂模式
ECMAScript 中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节。
function my(name,age,job){
var zw=new Object();
zw.name=name;
zw.age=age;
zw.job=job;
zw.getName=function(){
console.log(this.name);
}
return zw;
}
var per=my("zw",20,"student");
console.log(per instanceof my);//false
console.log(per instanceof Object);//true,因为在js中函数也是对象
per.getName();//zw
工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型,譬如怎样测试出per这个对象是person这个类型的。
构造函数模式
function my(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.getName=function(){
console.log(this.name);
}
}
var per=new my("zw",20,"student");
console.log(per instanceof my);//true
console.log(per instanceof Object);//true
per.getName();//zw
与上面工厂模式不同的是:
- 没有显式地创建对象;
- 直接将属性和方法赋给了 this 对象;
- 没有 return 语句。
要创建 my 的新实例,必须使用 new 操作符。以这种方式调用构造函数实际上会经历以下 4个步骤:
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。
而且这种模式下per保存了my的一个实例,per对象有一个constructor属性,该属性指向my。对象的 constructor 属性最初是用来标识对象类型的。但是,提到检测对象类型,还是用上面的 instanceof 操作符要更可靠一些。