javascript创建对象之构造函数模式(二)
对上一章节的工厂模式进行代码重写
function Human(name, sex) {
this.name = name;
this.sex = sex;
this.say = function () {
alert(this.name);
}
}
var man = new Human("汉武大帝", "男");
var woman = new Human("王母娘娘","女");
看到Human没有.他的第一个字母大写了.这是一种语法约定.构造函数始终应该以一个大写字母开头,而非构造函数则以一个小写字母开头,用于区分构造函数和非构造函数.
要创建Human的实例,必须使用new操作符.这就会出现以下四个步骤:
1.创建一个新对象或变量.
2.将构造函数的作用域赋值给新变量或新对象.
3.执行构造函数中的代码
4.返回新对象.
alert(man instanceof Object);//true
alert(man instanceof Human); //true
alert(woman instanceof Object); //true
alert(woman instanceof Human); //true
这里的true很好的说明了:创建自定义的构造函数意味着将来可以将他的实例表示为一种特定的类型.而这正是构造韩式模式优于工厂模式的地方.
尽管如此,构造函数还是有自己的一些缺陷,或者说不足吧.
在man和woman中都有一个名为say()的方法,他们的功能一模一样.但是这两个方法却不是同一个Function()实例创建出来的.
function Human(name, sex) {
this.name = name;
this.sex = sex;
this.say = new Function("alert(this.name);");
}
这就意味着如果需要n个实例,就要创建n个say的Function()实例.这样还是会造成资源的浪费.
继续对上面的代码经行优化,让这个say()方法只创建一次.共用一个引用.
function Human(name, sex) {
this.name = name;
this.sex = sex;
this.say = say;
}
function say() {
alert(this.name);
}
因为say包含一个指向函数的指针,因此Human的实例就共享了全局作用域中的同一个say()函数.但这个无法让人接受,
因为如果系统比较庞大的话,就会出现很多全局变量,一不小心就会有被改掉的危险.而我们封装的对象就没有封装性可言了.
接着就又有了原型模式了.下一章在接着说原型模式.
javascript创建对象之构造函数模式(二)的更多相关文章
- JavaScript面向对象OOM 2(JavaScript 创建对象的工厂模式和构造函数模式)
在创建对象的时候,使用对象字面量和 new Object() 构造函数的方式创建一个对象是最简单最方便的方式.但是凡是处于初级阶段的事物都会不可避免的存在一个问题,没有普适性,意思就是说我要为世界 ...
- JavaScript设计模式之构造函数模式
一.构造函数模式概念 构造函数用于创建特定类型的对象——不仅声明了使用过的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象 ...
- javascript --- 设计模式之构造函数模式
在JavaScript里,构造函数通常是认为用来实现实例的,JavaScript没有类的概念,但是有特殊的构造函数.通过new关键字来调用定义的否早函数,你可以告诉JavaScript你要创建一个新对 ...
- javascript创建对象之原型模式(三)
少废话,先上代码: function Human() { } Human.prototype.name = "成吉思汗"; Human.prototype.sex = " ...
- javascript创建对象之工厂模式(一)
工厂模式在软件工程里面是一种比较常见的设计模式了.这种模式抽象了创建具体对象的过程. 上代码: function createHuman(name,sex) { var obj = new Objec ...
- JS创建对象之构造函数模式
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = f ...
- javascript工厂模式和构造函数模式创建对象
一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...
- javascript创建对象的方法--构造函数模式
javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
一.仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下: 1.它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题 ...
随机推荐
- ue使用
快捷键CTRL+V:输入代码提示自动补全 编辑器Ultraedit快捷键 说到编辑器的快捷键,VIM是无与伦比的.要反对,也得是带脚踏板的EmaCS.UE还是有差距的,很大差距.注意:VIM是开 ...
- Thumbnailator java图片压缩,加水印,批量生成缩略图
地址:http://code.google.com/p/thumbnailator/ 1.指定大小进行缩放 //size(宽度, 高度) /* * 若图片横比200小,高比300小,不变 * 若图片横 ...
- [LeetCode&Python] Problem 804. Unique Morse Code Words
International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...
- CTF之当铺密码
当铺密码即:汉字的笔画有几笔出头,则代表数字几 例如:由=1 王=6 大=5
- 《DSP using MATLAB》Problem 4.15
只会做前两个, 代码: %% ---------------------------------------------------------------------------- %% Outpu ...
- shell 命令学习
https://blog.csdn.net/mnmlist/article/details/55215158
- AJAX异步实现简单的瀑布流
传统瀑布流布局ul-li,需要先设定显示几列,每列是一个li,需要左浮动并指定宽度,li里面的布局也要先布局好,主要是要定宽,高度自动:然后通过ajax异步,从数据库中得到数据,遍历后将数据插入最矮的 ...
- 使用webpack搭建vue项目中遇到的问题
1:data数据文件经试验,需要放在生成的build文件夹中才能生效,但是应该把data文件夹先放在src中,然后如何定义config文件,让其复制过去? new CopyWebpackPlugin( ...
- tomcat catalina.out切割脚本
shell脚本catalina.out 切割脚本...每天23.30切割.删除七天之前的日志这里3个tomcat实例(1)拷贝日志文件(2)清空日志文件*只能清空如果删除tomcat不重启不会生成新的 ...
- SQLServer2008开启远程连接
1.查看sqlserver brower协议是否启动 2.对象资源管理器 右键属性->选择-> 方面->服务器配置->Remoteaccess ->True 3.对象资源 ...