创建对象
字面量形式创建对象
//格式
var 对象名 = {
属性名: 属性值,
属性名: 属性值,
方法名: function() {}
};
//创建car对象
<script type="text/javascript">
var car = {
//属性
brand: "宝马",
price: 10000000,
color: "grey",
//方法
run: function(){ console.log("跑起来了!!"); },
stop: function(){ console.log("停下来了!!"); }
};
</script>
查询输出,注意car.run输出的是整个方法体,car.run()是执行方法。
添加属性
对象名.属性名 = 值;
对象名["属性名"] = 值;
删除属性
delete 对象名.属性名;
delete 对象名["属性名"];
修改属性
对象名.属性名 = 值;
对象名["属性名"] = 值;
查找属性
对象名.属性名;
对象名["属性名"];
区别:点语法不支持变量、而中括号支持变量
注意:如果对象中有该属性,那么返回属性的值。如果对象中没有该属性,那么返回undefined
遍历属性
for (var 变量名 in 对象名) {
console.log(变量名+":"+对象名[变量名]);
}
in关键字
该关键字的作用是判断一个属性是否属于该对象
格式:属性名 in 对象
结果为true(包含该属性)或者false(不包含该属性),该关键字不仅可以判断私有属性,也可以判断原型中的公有属性
调用方法
对象名.方法名();
对象名["方法名"]();
注意:如果在调用方法时不加小括号,会获取该方法的方法体
修改方法
对象名.方法名 = function() {};
对象名["方法名"] = function() {};
删除方法
delete 对象名.方法名;
delete 对象名["方法名"];
字面量形式创建对象的利弊
优点:简单、易懂
缺点:
不利于提高代码的复用性
通过字面量形式创建的对象都是Object类型,没有办法进行细化对象的类型
工厂模式创建对象
就是把创建对象的语句封装到一个函数中,该函数的作用就是可以批量的创建具有同种属性的对象,它有利于提高代码的复用性
//格式1
function 函数名(参数1,参数2…) {
var obj = new Object(); //格式2将第一行语句替换为 var obj = {};
obj.属性名1 = 参数1;
obj.属性名2 = 参数2;
obj.方法名3 = function() {};
return obj;
}
//格式3
function 函数名(参数1,参数2…) {
return {
属性名1:参数1,
属性名2:参数2,
方法名3:function(){}
}
}
//创建createObj工厂
<script type="text/javascript">
function createObj(name,age,gender){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.gender = gender;
obj.speak = function() { console.log("hello world") };
return obj;
}
var res1 = createObj("张三",10,"男");
var res2 = createObj("李四",18,"男");
</script>
工厂模式创建对象的利弊
优点:解决了批量创建具有同种属性的对象的问题,提高了代码的复用性
缺点:也没有解决对象类型的区分问题
构造方法创建对象
创建对象的方式有字面量形式创建对象,工厂模式创建对象,但是他们都没有解决对象类型的区别问题。构造方法就是一个用来批量创建具有同种属性的对象的特殊函数。该种创建对象的方法解决了对象类型区分问题
//格式
function 函数名(参数1,参数2,参数3…) {
this.属性名1 = 参数1;
this.属性名2 = 参数2;
this.方法名 = function(){};
}
//创建Car构造方法
<script type="text/javascript">
function Car(brand,price,color){
this.brand = brand;
this.price = price;
this.color = color;
this.run = function(){ console.log('跑起来了!!'); };
this.stop = function(){ console.log('停下来了!!'); };
}
var res = new Car("QQ",30000,"red");
</script>
注意
构造函数的本质也是函数,但是为了普通函数做区分,构造函数的名字通常为单词首字母大写;
如果构造方法中不包含参数,那么在调用时可以省略小括号,如var arr = new Array;
如果是内置的构造方法,那么在调用时可以省略new关键字,如var arr = Array(); 但是不可以将new关键字和小括号同时省略,否则无法创建对象。
构造函数中可以定义变量,这个变量属于该函数的局部变量,在该函数内部可以使用,但是要注意由该构造函数创建出来的对象无法访问该变量,因为它不属于任何对象,为了提高代码的安全性和健壮性,可以在构造函数中创建set和get方法对此局部变量进行操作。
构造方法中不加return关键字,如果加return关键字,那么如果返回值的类型为基本类型,不影响构造方法创建对象,即此时依旧可以返回对象,但是如果return后面的返回值为引用类型,那么构造方法创建出来的对象就会被覆盖掉。