javascript面向对象(一)-创建对象

第一种:通过 new Object 得到

var person = new Object();
person.name = "店小二";
person.age = 18;
person.say = function() {
    //this,指向person对象所定义的属性
    alert("我的名字是:"+this.name+",我今年"+this.age+"岁了");
}
person.say();
使用这种定义的方式,虽然可以定义一个对象,但是因为没有类的约束,所以无法实现对象的重复使用。

第二种:使用 json 得到

<span style="font-size:14px;"><span style="white-space:pre">		</span>var person = [{
			name: "店小一",
			age: 16,
			sex: "男",
			friends: ["店小二", "店小三"],
			say: function() {
				alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex + "\n朋友:" + this.friends);
			}
		},{
			name: "店小二",
			age: 16,
			sex: "男",
			friends: ["店小一", "店小三"],
			say: function() {
				alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex + "\n朋友:" + this.friends);
			}
		},{
			name: "店小三",
			age: 16,
			sex: "男",
			friends: ["店小一", "店小二"],
			say: function() {
				alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex + "\n朋友:" + this.friends);
			}
		}]</span>

同第一种方法一样缺点。


第三种:使用工厂模式得到

function creatPerson(name,age,sex) {
    var Person=new Object;
    Person.name=name;
    Person.age=age;
    Person.sex=sex;
    Person.say=function(){
    alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex)
    }
    return Person;
}
var p1 = creatPerson("店小二",12,"男");
p1.say();
alert(typeof p1);

使用工厂模式定义了对象,这样就很好的解决了对象无法重用的问题,但是此时又存在了另一个问题,就是无法判断

得到的对象的类型了,如 typeof 或者 instanceof来判断类型,仅仅得到一个 Object 类型。


第四种:使用构造函数来创建一个对象

function Person(name,age,sex){
    this.name=name;
    this.age=age;
    this.sex=sex;
    this.say=function(){
	alert("名字:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex)
    }
}
var p1= new Person("店小二",12,"男");
p1.say();
alert(p1 instanceof Person); //判断一个对象属于某个类,返回布尔值

基于构造函数的定义的方式最大的好处除了对象重复使用外,就是让我们还可以判断它的类型。
此时基于构造函数的定义对象的方式看似已经很完美了,需要的问题它都可以解决了, 但是却存在一个问。
通过代码分析得知:say 方法在每个对象创建后都存在了一个方法拷贝(但是我们发现代码在只有调用时,say 方法才会在堆中创建),这样就增加了内存的消耗了,如果在对象中有大量的方法时,内存的消耗就会高,这样不行了。
可以试着将方法写到构造函数外边,但是这样会带来另一个问题,就是方法一但定义为全局函数,那么 window 对象就可以调用该方法,这样就破坏了对象的封装性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值