0.前言
有一段时间没写博客了,上次我们说了一种用字面量方法创建对象病房舒文属性和方法,这一次和大家分享另外两种常用方法:
- 工厂模式创建对象(返回对象的函数)并访问属性和方法
- 构造函数创建对象并访问属性和方法
1.工厂模式创建对象(返回对象的函数)并访问属性和方法
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>工厂模式创建对象(返回对象的函数)并访问属性和方法</title>
</head>
<body>
<script type="text/javascript">
//使用工程模式可以快速、大量的创建拥有相同属性和行为的对象
function createGirlFriend(a){
return {
name: a,
eat: function(){
console.log("吃");
}
};
}
var girl1 = createGirlFriend("二雷");
var girl2 = createGirlFriend("三雷");
console.log(girl1);
console.log(girl2);
console.log(typeof girl1);
//访问属性与方法
console.log(girl1.name);
girl1.eat();
//动态增加属性
girl1.age = 17;
console.log(girl1);
console.log(girl2);
//动态增加方法
girl1.eat = function() {
console.log("eat");
};
//动态删除
delete girl1.age;
delete girl1.eat;
</script>
</body>
</html>
2.构造函数创建对象并访问属性和方法(常用)
构造函数(就是函数,为了做区分,一般我们将构造函数的首字母大写)
注意:构造函数声明后不会被执行,仅仅是定义了一个用于这些属性和方法的"类型",没有任何对象的实例产生
(1)声明构造函数
function GirlFriend(name, age, height, weight) {
//属性
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
//函数内部普通变量看成是对象的私有属性(外部无法访问)
//可以通过中间函数间接访问
var _money = 10000000;
this.setMoney = function(money) {
_money = money;
};
this.getMoney = function(){
return _money;
};
this.eat = function() {
console.log("吃");
console.log(_money);
};
}
(2)创建对象
公式:var 对象名 = new 构造函数名(参数列表);
扩展:new 构造函数名(参数列表)的讲解
1.在堆区开辟出一片空间用来保存对象;
2.将对象中对应的属性进行赋值;
3.返回对象的引用(栈区)。
var girl1 = new GirlFriend("大雷", 20, 150, 180);
console.log(girl1);
结果:
(3)间接访问私有属性
girl1.setMoney(100);
console.log(girl1.getMoney());
girl1.eat();
结果:
(4)多个对象之间相互不影响
var girl2 = new GirlFriend("二雷", 19, 1500, 1800);
console.log(girl2.age);
console.log(girl2.getMoney());
结果:
(5)添加静态方法
GirlFriend.staticFunc = function() {
console.log("我是静态函数");
};
//调用静态函数
GirlFriend.staticFunc();
注意:条用静态方法,要用构造函数名调用。
//添加属性
girl1.faceValue = 100;
//添加方法
girl1.run = function() {
console.log("run");
};
girl1.run();
//删除
delete girl1.faceValue;
delete girl1.run;
3.传递对象
声明两个变量,引用同一个对象,那么这两个变量相同吗?答案是肯定不相同,这是两个不同的变量。
var obj1 = {
name:"sunck",
age:18,
height:175,
weight:65,
};
//obj3与obj1引用的是同一个对象,但是这是两个不同的变量
var obj3 = obj1;
obj1.height = 180;
console.log(obj3.height);
4.传递的比较
var obj1 = {
name : "wh",
age : 18,
height : 175,
weight : 65,
};
var obj3 = obj1;
console.log(obj1 == obj3);
console.log(obj1 == obj3);
var obj5 = {
name : "wh",
age : 18,
height : 175,
weight : 65,
};
console.log(obj1 == obj5);
console.log(obj1 == obj5);
结果:
总结:①两个对象比较仅且当这两个引用是同一个对象时才真的相等。
②如果两个引用指向的是不同的对象,但是对象的属性与行为完全相同的,那么这两个对象也是不相等的。