看书看了很久的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,引用地址一致了。
分享到:
相关推荐
李炎恢JavaScript视频教程[Avi版]中的讲义 非常好~
本文主要内容参考来自JavaScript高级程序设计,面向对象与原型章节: 1、工厂模式 ECMAScript 可以通过工厂模式来创建对象: //工厂模式 function createObject(name, age) { var obj = new Object(); //创建对象 ...
主要介绍了JavaScript 面向对象与原型,需要的朋友可以参考下
原型法和面向对象的分析与设计方
具体分析面向对象分析与设计中的原型法,虽然现在流行快速开发,不过了解基本的分析设计原型很有用
python强大的面向对象能力,让你更好的理解python核心语法
原型是理解继承概念的关键, 我们将会教你如何建立原型, 如何检测一个对象是否是另外一个对象的原型, 及其 JavaScript 的模型与Java 面向对象编程之间的区别。我们同样会向你展示如何检测对象所包含的各种属性的方法...
第16周-第16章节-Python3.5-JavaScript面向对象及原型.avi
如何实现JavaScript中缺失的面向对象特性,如对象的私有成员与私有方法;如何应用适当的编程模式,发挥JavaScript语言特有的优势;如何应用设计模式解决常见问题等。 《JavaScript面向对象编程指南》着重介绍...
如何实现JavaScript中缺失的面向对象特性,如对象的私有成员与私有方法;如何应用适当的编程模式,发挥JavaScript语言特有的优势;如何应用设计模式解决常见问题等。, 《JavaScript面向对象编程指南》着重介绍...
JavaScript作为一门浏览器语言的核心思想;...如何实现JavaScript中缺失的面向对象特性,如对象的私有成员与私有方法;如何应用适当的编程模式,发挥JavaScript语言特有的优势;如何应用设计模式解决常见问题等。
C#面向对象设计模式纵横谈(1):面向对象设计模式与原则 C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) C#面向对象设计...
JS面向对象经典案例,JS面向对象过程中用到的一些技术,例如对象、类、JS继承Call、JS原型链Prototype、JS闭包等等
本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别...
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式).docx
面向对象(Object-Oriented,缩写为OO)方法的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)...
由于JS不是纯的面向对象的语言,所以对象的继承是以原型函数的形式继承的,很多人刚开始接触的时候不太理解,但是JS这种以原型函数的形式实现面向对象技术,不仅是可行的,而且还为面向对象技术提供了动态继承的功能...
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...