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语 ...
随机推荐
- [转] 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...
- 发送Json数据,WebApi查看时为Null的问题(已解决)
1. PostMan :发送请求的Body中选择form-data是不行的.,body中的内容也要选择raw json格式. 2.如果是代码中填写的对象,api中解析为null,说明字段的值未对 ...
- 【SPFA与Dijkstra的对比】CDOJ 1961 咸鱼睡觉觉【差分约束-负权最短路径SPFA】
差分约束系统,求最小值,跑最长路. 转自:https://www.cnblogs.com/ehanla/p/9134012.html 题解:设sum[x]为前x个咕咕中至少需要赶走的咕咕数,则sum[ ...
- window.open跳过浏览器拦截
转自https://www.cnblogs.com/shizk/p/8458916.html $('#btn').click(function () { //打开一个不被拦截的新窗口 var newW ...
- asp.net MVC5为WebAPI添加命名空间的支持
前言 默认情况下,微软提供的MVC框架模板中,WebAPI路由是不支持Namespace参数的.这导致一些比较大型的项目,无法把WebApi分离到单独的类库中. 本文将提供解决该问题的方案. 微软官方 ...
- Codeforces 1012D AB-Strings 贪心
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1012D.html 题目传送门 - CF1012D 题意 给定字符串 $s,t$ ,其中只包含小写字母 $a ...
- BZOJ3437 小P的牧场 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8696321.html 题目传送门 - BZOJ3437 题意 给定两个序列$a,b$,现在划分$a$序列. 被划 ...
- BZOJ1455 罗马游戏 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1455 题意概括 n个人,2种操作. 一种是合并两个人团,一种是杀死某一个人团的最弱的人. 题解 左 ...
- Vijos1982 NOIP2015Day2T2 子串 substring 动态规划
子串 (substring.cpp/c/pas) 题目链接 [问题描述]有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重叠 的非空子串,然后把这 k 个子串按照 ...
- psp表格记录-
PSP2.1 Personal Software Process Stages Time Planning 计划 · Estimate · 估计这个任务需要多少时间 12 Development 开发 ...