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 ...
随机推荐
- [Hibernate] - Annotations - Many To Many
Hibernate annotation 多对多: 下面测试例子会自动生成一张表:card,这张是bank和user表的映射表.里头是bank_id和user_id两个组合字段. 如果想在这张映射表中 ...
- UIview定义背景图片
UIImage *image = [UIImage imageNamed:@"bgimagename"]; UIView *view = [[UIView alloc]ini ...
- HackerRank "Morgan and a String"
I saw the same sub-problem in LeetCode, and there exists a O(n) neat greedy solution: for _ in range ...
- 6.25$post('',function(){});无法触发问题
试了很久,发现把这个方法放错位置了
- ORA-04031案例一则
ORA-04031这个错误,几乎每一个专业的DBA都遇到过.这是一个相当严重的错误,Oracle进程在向SGA申请内存时,如果申请失败,则会报这个错误.大部分情况下是在向SGA中的shared poo ...
- cent os下面的基本配置操作
二,修改Linux分辨率命令行 在root用户模式下,输入$ vi /boot/grub/grub.conf(路径可能会不一样,也可以是 /etc/grub.conf),打开grub.conf文件 我 ...
- 调试压缩后的Javascript文件:在 Chrome 和 Safari ,选择“脚本”标签,找到相应的文件,然后点击“{}”图标(pretty print,在面板底部)
- C++ 常见崩溃问题分析
一.前言 从事自动化测试平台开发的编程实践中,遭遇了几个程序崩溃问题,解决它们颇费了不少心思,解决过程中的曲折和彻夜的辗转反侧却历历在目,一直寻思写点东西,为这段难忘的经历留点纪念,总结惨痛的教训带来 ...
- hadoop-spark-hive-hbase配置相关说明
1. zookeeper 配置 cp app/ochadoop-och3.0.0-SNAPSHOT/zookeeper-3.4.5-cdh5.0.0-beta-2-och3.0.0-SNAPSHOT/ ...
- linux命令(13) 删除指定文件夹下后缀名相同的文件
方法一: find 目录 -name "*.abc" | xargs rm命令有点危险,可以先执行前半段,看看是不是你要删除的文件, 然后再整条执行 方法二:find . -nam ...