JS_高程6.面向对象的程序设计(2)创建对象_1
一.创建对象的常见方法
(1)Object构造函数创建单个对象,早期的JavaScript开发人员经常使用该模式创建新对象。
var person=new Object();
person.name="xiaoming";
person.age=16;
person.job="Software Engineer"; person.sayname=function(){
console.log(this.name);
} person.sayname();//xiaoming
(2)使用对象字面量的方法创建单个对象,后来该方法成为创建这种对象的首选方法
var person={
name:"xiaoming",
age:16,
job:"Software Engineer",
sayname:function(){
console.log(this.name);
}
}
person.sayname();//xiaoming
#思考#
使用以上两种方法都可以创建单个对象,但是这些方式的不足是:使用同一接口创建很多对象,会产生大量的重复代码。
eg:当我们需要创建三个person实例时(使用字面量的形式创建)
var person1={
name:"xiaoming1",
age:16,
job:"Software Engineer",
sayname:function(){
console.log(this.name);
}
}
var person2={
name:"xiaoming2",
age:16,
job:"Software Engineer",
sayname:function(){
console.log(this.name);
}
}
var person3={
name:"xiaoming3",
age:16,
job:"Software Engineer",
sayname:function(){
console.log(this.name);
}
}
person1.sayname();//xiaoming1
person2.sayname();//xiaoming2
person3.sayname();//xiaoming3
#思考#
为了解决这一问题,人们开始使用工厂模式的一种变体。开发人员开发了一种函数,用函数来封装以特定接口创建对象的细节。
function createPerson(name,age,job){
var o=new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayname=function(){
console.log(this.name);
};
return o;//注意这里返回对象o
}
var person1=createPerson("xiaoming1","16","Doctor");
var person2=createPerson("xiaoming2","18","Software Engineer");
person1.sayname();//xiaoming1
person2.sayname();//xiaoming2
#思考#
可以看到,以上工厂模式的创建方法相比Object构造函数和字面量创建对象实例,确实少了很多重复的代码。可以无数次的调用createPerson()函数,每次调用都会返回一个新的对象。
但是这种模式存在的不足是:没有解决对象识别的问题,即不知道一个对象的类型。(我的理解是:虽然可以创建很多对象,但是此类对象到底是哪种类型,我们是不知道的,如果有一个具体的对象名,代表的是此类对象,那就更好了!
为了解决工厂模式的这种不足,构造函数模式出现了。
通过创建自定义的构造函数,从而定义自定对象类型的属性和方法。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayname=function(){
console.log(this.name);
};
}
var person1=new Person("xiaoming1","16","Doctor");
var person2=new Person("xiaoming2","18","Software Engineer");
person1.sayname();//xiaoming1
person2.sayname();//xiaoming2
#思考#
可以看到构造函数模式比工厂模式又简洁了许多,重要的是,我们创建了一个可识别的对象,就是Person对象,可以通过new一个Person对象来进行对象的实例化。
对比Person和createPerson的不同是:
(1)没有显示的创建对象,在createPerson中有var o=new Object();
(2)直接将属性和方法赋给了this对象。
(3)没有return语句。
#注意#
注意:这里的Person是大写的,因为构造函数始终都应该以大写字母开头。
#思考#
以上这个例子中,person1和person2分别保存着Person的一个不同的实例,这两个对象都有一个constructor(构造函数)属性。
对象的constructor属性最初是用来标识对象类型的。例如这里:Person1和Person2这两个对象实例都是Person这个对象类型,所以返回true。
console.log(person1.constructor===Person);//true
console.log(person2.constructor===Person);//true
eg:
A construction function
function MyObj(){
this.number=1;
} var x=new String("Hi"); if(x.constructor==String){
document.write("Object is a String"+"<br/>"); } var y=new MyObj;
if(y.constructor==MyObj){
document.write("Object constructor is MyObj.")
}
#另:关于对象的constructor属性参见:https://msdn.microsoft.com/zh-cn/library/c1hcx253(v=vs.94).aspx
检测对象类型:instanceof操作符。
console.log(person1 instanceof Object);//true
console.log(person2 instanceof Object);//true
console.log(person1 instanceof Person);//true
console.log(person2 instanceof Person);//true
#到目前为止,我们创建对象的方法经历看以下改变:

JS_高程6.面向对象的程序设计(2)创建对象_1的更多相关文章
- JS_高程6.面向对象的程序设计(2)创建对象_3 构造函数存在的问题
# 上次讲到用构造函数的模式来创建对象,相对于工厂模式,解决可对象识别的问题. function Person(name,age,job){ this.name=name; this.age=age; ...
- JS_高程6.面向对象的程序设计(2)创建对象_2 构造函数也是一般函数
1.构造函数也是一般函数,以下创建一个构造函数. var Person=function(name,age,job){ this.name=name; this.age=age; this.job=j ...
- JS_高程6.面向对象的程序设计(1)理解对象
js的数据属性:P139(1)[[Configurable]](2)[[Enumerable]](3)[[Writable]](4)[[Value]] 使用Object.definerPropert( ...
- 重学js之JavaScript 面向对象的程序设计(创建对象)
注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式
·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 工厂模式和 构造函数模式
创建对象 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复代码. ·工厂模式 工厂模式是一种广为人知的设计模式,这种模式 ...
- python基础----面向对象的程序设计(五个阶段、对小白的忠告、关于OOP常用术语)、类、对象
一.面向对象的软件开发有如下几个阶段 1.面向对象分析(object oriented analysis ,O ...
- JavaScript 面向对象的程序设计(一)之理解对象属性
首先,JavaScript 面向对象的程序设计,主要分三部分. 理解对象属性: 理解并创建对象: 理解继承. 本文主要从第一方面来阐述: 理解对象属性 首先我们来理解Javascript对象是什么?在 ...
- JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承
相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...
随机推荐
- CentOS挂Windows的NFS备忘
Windows NFS 安装和配置 注:需要将名称为“所有计算机”的访问类型改为“无访问权限”,再将可访问IP的访问类型改为“读写”,并勾选“允许根目录访问” ,如WINDOWS有防火墙开放“204 ...
- javaScript事件(七)事件类型之键盘与文本事件
键盘事件如下: keydown:当用户按下键盘上的任意键时触发,而且如果按住不放的话,会重复触发此事件. keypress:当用户按下键盘上的字符键时触发,而且如果按住不放的话,会重复触发此事件. k ...
- 【loj6029】「雅礼集训 2017 Day1」市场&&【uoj#228】基础数据结构练习题
题解: 这两道题加上区间取min max应该算线段树几道比较不寻常的题目 其实也是挺好理解的 对于区间/d 显然在log次后就会等于0 而我们注意到如果区间中数都相等那么就可以一起除 也就是说每个区间 ...
- luogu 1471
题意: 蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. 操作1:1 x y k ,表示将第x到第y项每项加上k,k为一实数. 操作2:2 x y ...
- [转]java位运算(1)
http://blog.csdn.net/xiaochunyong/article/details/7748713 Java提供的位运算符有:左移( << ).右移( >> ) ...
- Azure附加新磁盘,差点掉进去的那个坑,注意临时数据盘
接今早的mysql问题,最终原因是mysql数据库的数据库文件以及pid丢失,当我还纳闷为什么丢失的情况下 我研究了下Azure云平台的数据磁盘原理,在Azure下,新建vm(centos)后只会提供 ...
- bootstrap下jQuery自动完成的样式调整-【jQuery】
1. 覆盖层调整 在bootstrap的对话框中,当其中的输入项使用了自动完成控件,则其中下拉框中的内容就会被bootstrap对话框的覆盖层遮盖. 为了能够使后面的自动完成的层显示出来,可以使用如下 ...
- Leading and Trailing(巧妙利用log解决次方问题)
Sample Input 5 123456 1 123456 2 2 31 2 32 29 8751919 Sample Output Case 1: 123 456 Case 2: 152 936 ...
- linux的文件打包与压缩
简介 Linux 上常用的压缩/解压工具,介绍了zip.rar.tar的使用. 文件打包和压缩 Linux 上的压缩包文件格式,除了 Windows 最常见的*.zip.*.rar..7z 后缀的压缩 ...
- JMeter快速入门
今天的年会已过,仍然是空手而归,不过俺坚信能让生活稳定永远都是努力.由于隔壁组负责年会的抢红包项目,因而趁此机会把通过工具模拟高并发的知识补了补,通过和身边大师的交流,总算是对压力测试有了个简要的了解 ...