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语 ...
随机推荐
- windows下面使用nssm设置新的服务实现开机自启等
1.下载: http://nssm.cc/download/?page=download 2.解压: 根据自己的系统选择相应的32bit或者64bit,然后将相应的可执行文件拷贝到系统环境中.配置环境 ...
- 【Android】AndroidManifest 中original-package标签
Manifest.xml 中 <manifest>标签中package属性用于设置应 用程序的进程名,即在运行时使用ddms查看到的进程名. <original-packag ...
- python全栈开发day87~91-整个流程梳理、CRM功能、知识点梳理
1.流程 1. stark组件 1. 启动 2.注册 3.url设计 4.视图函数设计 1.展示数据头 2.展示数据 3.list_display功能实现 4.list_display_links 功 ...
- mySql中SUBSTRING_INDEX函数用法
SUBSTRING_INDEX(str,delim,count) 返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串.如果 count 是一个正数,返回从最后的(从左边开始 ...
- BZOJ3451 Tyvj1953 Normal 点分治 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ3451.html 题目传送门 - BZOJ3451 题意 给定一棵有 $n$ 个节点的树,在树上随机点分 ...
- JavaEE 之 RESTful
1.RESTful a.定义:一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等 ...
- hdu 2364 Escape【模拟优先队列】【bfs】
题目链接:https://vjudge.net/contest/184966#problem/A 题目大意: 走迷宫.从某个方向进入某点,优先走左或是右.如果左右都走不通,再考虑向前.绝对不能往后走, ...
- Django 学习第三天——模板变量及模板过滤器
一.模板路径的查找: 查找顺序:(现在哪找到就用那个) 首先在主目录的 setting.py 文件里的 TEMPLATES 中的 DIRS 里找: 其次如果 DIRS 中的 APP_DIRS : 'T ...
- shell编程第二天
- Xamarin Essentials教程陀螺仪Gyroscope
Xamarin Essentials教程陀螺仪Gyroscope 陀螺仪是用来检测设备在X.Y.Z轴上所旋转的角速度.应用程序通过陀螺仪可以获取设备在各个方向的转动角速度,可以实现更为丰富的控制功 ...