js 中使用工厂方法和构造器方法
1 直接创建对象
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> /**
* 在js中并不存在类,所以可以直接通过Object来创建
* 但是使用如下方式创建,带来最大的问题:由于没有类的约束
* 无法实现对象的重复利用,并且没有一种约束,在操作时会带来问题
*/
var person = new Object();
person.name = "Leon";
person.age = 33;
person.say = function(){
console.info(this.name + " , " + this.age);
}
</script> </head>
<body> </body>
</html>
2 使用json的方式创建对象
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> /**
* json的意思就是javascript simple object notation
* json就是js的对象,但是他省去了xml中便签,而是通过{}来完成对象的说明
*/
var person = {
name : "张三",
age :23 ,
say : function(){
console.info(this.name + " , " + this.age);
}
}
person.say(); /**
* 通过json依然可以创建对象数组,创建的方式饿js的数组一样
*/
var ps = [
{
name : "Leon",
age : 22
},{
name : "Ada",
age : 33
}
];
for(var i = 0 ; i < ps.length ; i ++){
console.info(ps[i].name);
} /**
* 创建一组用户,用户的属性有
* name : string
* age : int
* friends : array
* List<Person> ps = new ArrayList<Person>();
* ps.add(new Person("Leon" , 22 , ["Ada","Alice"]));
* ps.add(new Person("John" , 33 , ["Ada","Chris"]));
* 把ps转换为json
*/
ps = [
{
name : "Leon",
age : 22,
friends:["Ada" , "Alice"]
},{
name : "John",
age : 33,
friends : ["Ada","Chris"]
}
]; </script> </head>
<body> </body>
</html>
3 使用工厂方式创建
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> /**
* 通过工厂的方式来创建Person对象
* 在createPerson中创建一个对象
* 然后为这个对象设置相应的属性和方法
* 之后返回这个对象
*/
function createPerson( name , age ){
var o = new Object();
o.name = name ;
o.age = age ;
o.say = function(){
console.info(this.name + " , " + this.age);
}
return o ;
}
/**
* 使用工厂的方式,虽然有效的解决了类的问题,
* 但是依然存在另外一个问题:无法获取对象的数据类型,即:
* 通过p1 instanceof ? 无法获取对象p1 和p2 的数据类型,
* 通过typeof仅仅只能检测出object类型,如果希望使用instanceof来检测的话,无法确定检测的类型
* 解决方式:使用构造函数的方式解决问题
*/
var p1 = createPerson("Leon" , 22);
var p2 = createPerson("Ada" , 33);
p1.say();
p2.say();
console.info(p1 + " " + p1 instanceof ? ); </script> </head>
<body> </body>
</html>
4 使用构造器创建
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title> <script type="text/javascript"> /**
* 通过构造函数的方式创建,和基于工厂的创建类似
* 最大的区别就是函数的名称就是类的名称,按照java的约定,第一个字母大写。
* 使用构造函数创建时,在函数内部是通过this关键字来完成属性的定义
*/
function Person(name , age){
this.name = name;
this.age = age ;
//以下方式带来的问题就是所有的对象都会为该行为分配控件
this.say = function(){
console.info(this.name + " , " + this.age);
}
} //通过new Person来创建对象
var p1 = new Person("Jhon" , 22);
var p2 = new Person("Ada" , 32);
p1.say(); //Jhon , 22
p2.say(); //Ada , 32
//使用构造函数的方式可以通过以下方恨死来检测对象的类型
console.info( p1 instanceof Person) ;//true /**
* 使用构造函数穿件带来的问题
* 在java中:
* class Person{
* int id ;
* String name ;
* public void say(){
*
* }
* }
* Person p1 = new Person();
* Person p2 = new Person();
* person的say方法里面的变量在栈中分配,在调用say方式的时候才分配空间,
* 而内存堆中只会存放id和name,不管创建多少个Person对象,say方法只会调用一块空间,在调用的时候才创建,
* 所有say是不占用空间的
*
* 在js中使用构造函数:
* 带来的问题就是每一个对象中都会存放一个方法的拷贝,如果对象的行为很多的话,
* 控件的占用率就会大大增加,即每创建一个person对象就分配一个say空间
*
* 解决方法:
* 可以将函数放到全局变量中定义,这样就可以让所有的类中的行为指向同一个函数
*/
console.info(p1.say == p2.say); //false //以下内容为解决方法: function Person2(name , age){
this.name = name;
this.age = age ;
this.say = say;
}
/**
* 将行为设置为全局的行为,如果将所有的方法都设计为全局函数的时候,
* 这个函数就可以被window调用,此时就破坏了对象了封装性,
* 而且如果某个对象有大量的方法,就会导致整个代码充斥着大量的全局函数
* 这样将不利于开发
*/
function say(){
console.info(this.name + " , " + this.age);
} var p1 = new Person2("Jhon" , 22);
var p2 = new Person2("Ada" , 32);
p1.say(); //Jhon , 22
p2.say(); //Ada , 32
console.info(p1.say == p2.say); // true </script> </head>
<body> </body>
</html>
js 中使用工厂方法和构造器方法的更多相关文章
- js中style.display=""无效的解决方法
本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...
- js中数组去重的几种方法
js中数组去重的几种方法 1.遍历数组,一一比较,比较到相同的就删除后面的 function unique(arr){ ...
- JS 中深拷贝的几种实现方法
JS 中深拷贝的几种实现方法1.使用递归的方式实现深拷贝 //使用递归的方式实现数组.对象的深拷贝 function deepClone1(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是 ...
- js中的splice方法和slice方法简单总结
slice:是截取用的 splice:是做删除 插入 替换用的 slice(start,end): 参数: start:开始位置的索引 end:结束位置的索引(但不包含该索引位置的元素) 例如: va ...
- js中判断数据类型的四种方法总结
js中判断数据类型的四种方法 前言 在js中,我们经常需要判断数据的类型,那么哪些方法可以用来判断数据的类型呢?哪种方法判断数据类型最准确呢? 我们来一个个分析: 1.typeof typeof是一个 ...
- js中this的四种使用方法
0x00:js中this的四种调用模式 1,方法调用模式 2,函数调用模式 3,构造器调用模式 4,apply.call.bind调用模式 0x01:第一种:方法调用模式 (也就是用.调用的)this ...
- Js中数据类型判断的几种方法
判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...
- js中判断鼠标滚轮方向的方法
前 言 LiuDaP 最近无聊,在做自己的个人站,其中用到了一个关于鼠标滚轮方向判断的方法,今天闲来无聊,就给大家介绍一下吧!!!! 在介绍鼠标事件案例前,让我们先稍微了解一下js中的event ...
- 用Java开发一个工具类,提供似于js中eval函数功能的eval方法
今天在看到<Java疯狂讲义>中一个章节习题: 开发一个工具类,该工具类提供一个eval()方法,实现JavaScript中eval()函数的功能--可以动态运行一行或多行程序代码.例如: ...
随机推荐
- php 计算本月第一天 本月最后一天 下个月第一天
本文转载自 http://jin541223.blog.163.com/blog/static/1637398052011111233018533/ //本周第一天(星期日为一周开始) echo ...
- 支持 MBTiles 规范的预缓存
SuperMap iServer 支持生成符合MBTiles规范的预缓存(MBTiles是由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范. 该规范由Ma ...
- Maps
Maps.uniqueIndex()将列表转换为map //iterator各个元素作为Map.values, key为Function.apply返回值 Maps.uniqueIndex(ps.i ...
- When not to automate 什么时候不进行自动化
The cornerstone of test automation is the premise that the expected application behavior is known. W ...
- js正则表达式中=s.g表示什么意思
//g是全局匹配//中间的内容表示:匹配以=开关,后面是0或多个空格,然后是双引号括起来的任意字符,比如:= "any symble" 匹配 = " asfjaskldf ...
- 重新安装python
1. 在上次进行安装python的时候,很多东西不能用,例如后退键,删除键,都是不能在命令行中使用,主要原因是在编译python的时候,相关的安装包没有进行安装,从而导致出现乱码,在编译最新版本的py ...
- 关于微信聊天与朋友圈如何快速切换 Mark
用微信时,你是否遇到这样的情况.你正刷着朋友圈,享受着各种鸡汤,这时候,你收到一条微信,一看是女王大人,不得不回.你诚恳的回了一条,等了二十秒不见有什么回应,于是就退了出来,进入朋友圈找到那篇没看完的 ...
- 输出(test)
本题要求从输入的N个整数中查找给定的X.如果找到,输出X的位置(从0开始数):如果没有找到,输出“Not Found”. 输入格式: 输入在第1行中给出2个正整数N(<=20)和X,第2行给出N ...
- 记录一下JS正则的坑
JS正则的单行模式有点问题 总之 . 符号匹配换行符号会有问题 暂时的解决方案是 html = html.replace(/[\r\n]/g,""); 附加一个 html = ht ...
- pybombs 安装
参考:https://github.com/gnuradio/pybombs 先装:pip 然后: pip install PyBOMBS 更新源: pybombs recipes add gr-re ...