js对象3--工厂方法加深引出原型--杂志
继续上一章的案例讲解:
<script type="text/javascript">
function createPreason(name,sex){ //他的怪癖,喜欢参数
var person= new Object(); //创建一个对象
person.name = name; //给对象添加一个name属性
person.sex = sex; //给对象添加一个sex属性
person.sayName= function(){
alert("大家好我是:"+this.name); // 打印出:传进来的参数name的真正值 这里的this代表调用该方法的对象
}
person.saySex= function(){
alert("性别:"+this.sex); // 打印出:传进来的参数sex的真正值 这里的this代表调用该方法的对象
}
return person; //返回对象
} var p1 = createPreason("小龙哥","男"); //调用工厂模式创建对象p1
var p2 = createPreason("小龙女","女"); //调用工厂模式创建对象p2
p1.sayName(); //打印出 大家好我是:小龙哥
p1.saySex(); //打印出 性别:男
p2.sayName(); //打印出 大家好我是:小龙女
p2.saySex(); //打印出 性别:女
</script>
我们说到 js的关键字this代表的是--》调用该函数的对象(通俗易懂的一句话:当前的函数属于谁)
这个说法没毛病:四海皆知嘛。
但是有一点不知:
一:函数前面有new的时候
<script type="text/javascript">
function createPreason(name,sex){ //他的怪癖,喜欢参数
this.name = name; //给对象添加一个name属性
this.sex = sex; //给对象添加一个sex属性
this.sayName= function(){
alert("大家好我是:"+this.name); // 打印出:传进来的参数name的真正值 这里的this代表调用该方法的对象
}
this.saySex= function(){
alert("性别:"+this.sex); // 打印出:传进来的参数sex的真正值 这里的this代表调用该方法的对象
} } var p1 =new createPreason("小龙哥","男"); //调用工厂模式创建对象p1
var p2 =new createPreason("小龙女","女"); //调用工厂模式创建对象p2
p1.sayName(); //打印出 大家好我是:小龙哥
p1.saySex(); //打印出 性别:男
p2.sayName(); //打印出 大家好我是:小龙女
p2.saySex(); //打印出 性别:女
</script>
这次的改进:函数createPreason()前面有new。函数内部的调整
1.去掉了函数里面的对象创建
2.去掉了return 返回
3.对象的调用换成了this
为什么这样改进呢?改进后的js内部如何执行的呢?
<script type="text/javascript">
function createPreason(name,sex){ //他的怪癖,喜欢参数
//假象系统内部自动构造出一个对象,这个对象赋值给了this
//var this = new Object(); this.name = name; //给对象添加一个name属性
this.sex = sex; //给对象添加一个sex属性
this.sayName= function(){
alert("大家好我是:"+this.name); // 打印出:传进来的参数name的真正值 这里的this代表调用该方法的对象
}
this.saySex= function(){
alert("性别:"+this.sex); // 打印出:传进来的参数sex的真正值 这里的this代表调用该方法的对象
}
//假象系统内部自动返回了
// return this;
} var p1 = new createPreason("小龙哥","男"); //调用工厂模式创建对象p1
var p2 =new createPreason("小龙女","女"); //调用工厂模式创建对象p2
p1.sayName(); //打印出 大家好我是:小龙哥
p1.saySex(); //打印出 性别:男
p2.sayName(); //打印出 大家好我是:小龙女
p2.saySex(); //打印出 性别:女
</script>
假象系统给我们函数内部添加了对象与return返回,我们只需要在里面添加想要的数据就行了。
一个总结:1.函数外面加new,里面不加new。相反:函数外面不加new,里面加new.
2.函数前面加new,系统会自动在函数的内部新创建一个对象赋值给this
再举一个例子加深印象:
function show (){
alert(this);
}
show(); //执行到这一步打印出:window (全局函数默认属于window, window.show() )
new show() //执行到这一步打印出:object
/**
function show(){
//假象系统内部执行流程
11 var this = new Object();
alert(this)
}
new show(); //执行到这一步打印出:objec
** /
好了this与new讲的差不多了,继续看下面
2.解决浪费--引出原型
还好现在的电脑内存大,够用,所以浪费的起那是任性,但是做程序必须做到能省则省的原则
案例求一个数组的和:
1 var arr1 = new Array(22,44,1,6,7); //也可以使用直接量创建 var arr1 = [22,44,1,6,7];
2 arr1.sum = function(){ //给数组arr1添加一个方法sum
3 var result = 0 //求和
4 var i = 0; //一个小的性能优化 不用每次for循环的时候都声明并初始化一个变量 i = 0
5 for(i = 0; i<this.length; i++){ //this 代表调用函数的对象为arr1
6 result+= this[i];
7 }
8 return result;
9 }
10 alert(arr1.sum()); //
要是我有很多个这样的数组要求和呢?
我们只是给arr1添加了一个求和的方法其他的数组没有这个方法,所以不能求其他的数组和(有人说还不如使用一个函数呢---恩,有道理。)
接下来就是该网上,书上...广泛流程的原型登场了。
js对象3--工厂方法加深引出原型--杂志的更多相关文章
- json转js对象方法,JS对象转JSON方法
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- js 中使用工厂方法和构造器方法
1 直接创建对象 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
- js对象拷贝的方法
对象拷贝的方法是一个难点,尤其是深拷贝.建议把代码都运行下,帮助理解拷贝. 一. json方法 1. 适合情况: JSON对象的深度克隆.方法是先JSON.stringify() 转为json字符 ...
- js对象的所有方法
Object构造方法 Object.assign() 将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象. Object.create() 用指定的原型对象和属性创建一个新对象. Object ...
- JS对象 返回星期方法 getDay() 返回星期,返回的是0-6的数字,0 表示星期天。如果要返回相对应“星期”,通过数组完成
返回星期方法 getDay() 返回星期,返回的是0-6的数字,0 表示星期天.如果要返回相对应"星期",通过数组完成,代码如下: <script type="te ...
- JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值
随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...
- Objective-C设计模式——工厂方法模式virtual constructor(对象创建)
工厂方法模式 工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象. 工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的 ...
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- js 对象的创建方式和对象的区别
js一个有三种方法创建对象,这里做一个总结. 1.对象直接量 所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议, 1 2 3 4 5 6 7 8 9 10 11 12 ...
随机推荐
- 【shell】 for循环
#!/bin/bash for i in 1,3,4,6 ##有几个数就循环几次 do echo $i done for m in $( cat /root/num.log) ## /root/num ...
- Discuz!NT 3.9.913 Beta DIY过程
前提: 论坛的源码版本为dnt_3.9.913_sqlserver_beta.zip,以下例子都以这个版本为原型修改 dnt_3.9.913数据字典:下载 目前(2013年10月21日)官网的asp. ...
- ios外派—本公司长年提供ios程序员外派业务(北京动点软件,可签合同)
北京动点飞扬长年提供ios工程师外派业务. 我公司程序员平均技术情况如下: 1.二年以上iPhone/ipad开发经验:2.熟练使用Xcode.Objective C编码技能:3.熟悉iOS开发框架, ...
- (转)VS.NET2010水晶报表安装部署[VS2010]
本文转载自:http://www.cnblogs.com/xiaofengfeng/p/3325793.html 欢迎C#高手加盟QQ群:9340166 水晶报表VS2010版IDE安装标准版SAP ...
- HDU3507 print artical
题目大意:有N个数字a[N],每输出连续的一串,它的费用是 “这行数字的平方加上一个常数M”.问如何输出使得总费用最小.(n<=500000) 分析:动态规划方程为:dp[i]=dp[j]+M+ ...
- datagridview 列位置 设置顺序与加载显示顺序不一致
因为: dgv.AutoGenerateColumns = false;//禁止自动生成列 该属性是在 dgvJdmx.DataSource = dt; 之后设置的原因. 将两者调换,即可.
- PYTHON对文件及文件夹的一些操作
python中对文件.文件夹的操作需要涉及到os模块和shutil模块. 创建文件:1) os.mknod("test.txt") 创建空文件2) open("test. ...
- mssql查询某个值存在某个表里的哪个字段的值里面
第一步:创建 查询某个值存在某个表里的哪个字段的值里面 的存储过程 create proc spFind_Column_In_DB ( @type int,--类型:1为文字类型.2为数值类型 )-- ...
- system函数
system两层含义: 1.正确退出后.还需要再判断,操作成功或者操作失败. 2.错误退出. #include <stdio.h> #include <stdlib.h> #i ...
- 在编译oc中protocol时出现的错误
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang ...