`
妖术在烧纸
  • 浏览: 9272 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

面向对象与原型

阅读更多
看书看了很久的js面向对象也不明白,和java的面向对象差别太大,看书看得异常头疼。今天还是去翻了个视频出来看看才大概清楚了点,一一道来:
1、创建对象:
var box = new Object();//创建对象
box.name = "Vivian";   //添加属性
box.age = 100;
box.run = function(){ //添加方法
	return this.name + ' ' + this.age +'运行中。。。';
        //这里的this也可以用box,box == this,但在这个方法的外面就不能用this表示,放在外面this代表window,如果在方法外alert(this.name)就会打印出空。
}

alert(box.run());//调用方法一定要用();


2、当你要创建多个对象,但是这多个对象中的属性却只有名字不同,那这样实例化多个对象就会产生非常多重复的问题,由此我们来了解一下工厂模式:
function createBox(name,age){//将你需要的属性放到传进去
	var obj = new Object();   //创建对象
	obj.name = name;				
	obj.age = age;				//添加属性
	obj.run = function(){		//添加方法
		return this.name + this.age + '运行中...';
	};
	return obj;   //这里必须返回对象引用,不然外面无法获得
}

var box1 = createBox('vivian',100);
var box2 = createBox('jack',100);
alert(box1.run());//打印出vivian100运行中...

但是工厂模式有个问题,就是共创模式无法判断到底谁是谁的实例
alert(box1 instanceof Object)//true
alert(box2 instanceof Object)//true

所以无法判断谁是谁的实例

3、我们采用构造函数的方式来解决判断实例的问题
//构造函数
function Box(name,age){
	this.name = name;
	this.age = age;
	this.run = function(){
		return this.name + this.age + '运行中...';
	};
};
//1、构造函数不用返回引用对象,后台会自动返回
//2、构造函数名的第一个字母须大写以体现
//3、构造函数不用new Object,因为后台会自己帮我们new一个
var box1 = new Box('vivian',100);
var box2 = new Box('jack',200);
alert(box1.run());

//这里还无法判断是否区分开来,我们再写一个构造函数来看
function Pox(name,age){
	this.name = name;
	this.age = age;
	this.run = function(){
		return this.name + this.age + '运行中...';
	};
};

var box3 = new Pox('denny',100);
alert(box3 instanceof Box);//false,这里即可看出已经区分开了


当然我们也可以用对象冒充的方法来调用构造函数
var obj = new Object();
Box.call(obj,'vivian1',200);
alert(obj.run());//vivian1200运行中...

还有一个问题就是关于实例化引用地址的问题
如果我重新实例化box1,box2并且赋值相同
var box1 = new Box('vivian',100);
var box2 = new Box('vivian',100);
那么
alert(box1.name == box2.name);//返回true
如果我调用方法
alert(box1.run())//返回vivian100运行中...
alert(box2.run())//返回vivian100运行中...
alert(box2.run== box1.run);//比较地址返回false
//在分布实例化box1和box2的时候分别都拥有了自己的内存地址,所以比较的时候是不相同的

//但是如果我希望他们的内存地址也相同这又怎么办呢?
//你只需要把函数拿出来
function Pox(name,age){
	this.name = name;
	this.age = age;
	this.run = run;
};
function run(){  //把构造函数的内部方法通过全局函数来实现引用地址的一致性
	return this.name + this.age + '运行中...';
	};

var pox1 = new Pox('vivian',100);
var pox2 = new Pox('denny',100);
alert(pox1.run());//返回vivian100运行中...
alert(pox1.run == pox2.run);//返回true,引用地址一致了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics