目录
可以使用三种方式来创建对象,
利用对象字面量创建对象,
利用new Object创建对象,
利用构造函数创建对象
1.1 对象字面量创建对象
使用对象字面量,可以在创建对象时,直接指定对象中的属性
语法:{属性名:属性值,属性名:属性值......}
{ }里面采取键值对的形式表示,
键:相当于属性名
值:相当于属性值,可以是任意类型的值(数字类型,字符串类型,布尔类型,函数类型
var obj = {
name: "张三",
sex:" 男",
age:"24",
test:{name='李四'}
};
- 对象字面量的属性名可以加引号也可以不加引号,建议不加。
如果使用一些特殊的名字,则必须要加引号
- 属性名和属性值之间是一组一组的名值对结构
名和值之间使用' : '相连接,多个名值对之间使用 , 隔开,
如果一个属性之后没有其他的属性了,就不需要写' , '
- 对象内也可以嵌套对象,方法相同
2.1 工厂方法创建对象
对象字面量创建多个相同属性对象,需一个个复制粘贴修改,比较局限,可使用工厂方法创建对象
//采用工厂方法创建对象,可大批量创建对象
function fun(name,age,gender){
var obj=new Object();
obj.name=name;
obj.age=age;
obj.gender=gender;
obj.sayName=function(){
alert(this.name);
}
return obj;
}
var obj2=fun("张三",23,"男");
var obj3=fun("李四",26,"男");
console.log(obj2); //可显示对象内容
console.log(obj3);
obj3.sayName(); //可调用对象方法
注:
使用工厂方法创建的对象,使用的构造函数都是Object,所以创建的对象都是Object类型,无法区分多种不同类型的对象
3.1 构造函数
构造函数就是普通函数,创建方式和普通函数没有区别,不同的是构造函数习惯首字母大写,
构造函数和普通函数的区别就是调用方式的不同
普通函数是直接调用,而构造函数需要使用new关键字来调用
构造函数的执行流程:
1.立刻创建一个新的对象
2.将新建的对象设置为函数中的this
3.逐行执行函数中的代码
4.将新建的对象作为返回值返回
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类
我们将通过一个构造函数创建的对象,称为是该类的实例
//创建一个构造函数,专门用来创建Person对象
function Person(name,age) {
this.name = name;
this.age = age
}
function dog(name,age) {
this.name = name;
this.age = age
}
var per = new Person('张三',18); //构造函数Person,传参
var per1=new Person('李四',26);
var per2 =new dog('旺财',2); //构造函数dog
console.log(per);
console.log(per1);
console.log(per2);
console.log(per instanceof Person);
console.log(per2 instanceof Person);
使用instanceof可以检查一个对象是否是一个类的实例
语法:对象 instanceof 构造函数
如果是,则返回true,否则返回false.
附: 所有的对象都是Object的后代,所有任何对象和Object做instanceof检查时都会返回true
3.2 构造函数的修改
创建一个Person构造函数
在Person构造函数中,为每一个对象都添加了一个sayName方法,目前我们的方法是在构造函数内部创建的,也就是构造函数每执行一次就会创建一个新的方法。
这是完全没必要的,可以使所有对象共享同一个方法,即将方法放在全局作用域中,再引入到构造方法中
function Person(name,age) {
this.name = name;
this.age = age
//原版,方法赘余
// this.sayName =function(){
// console.log("我是"+name);
// }
this.sayName=fun;
}
function fun(){ //修改至外部
console.log("我是"+name);
}
var per = new Person('张三',18); //构造函数Person,传参
var per1=new Person('李四',26);
per.sayName();
per1.sayName();
注:将sayName方法在全局作用域中定义,污染了全局作用域的命名空间,且定义在全局作用域中也很不安全