继续上一章的案例讲解:

 <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--工厂方法加深引出原型--杂志的更多相关文章

  1. json转js对象方法,JS对象转JSON方法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. js 中使用工厂方法和构造器方法

    1 直接创建对象 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...

  3. js对象拷贝的方法

     对象拷贝的方法是一个难点,尤其是深拷贝.建议把代码都运行下,帮助理解拷贝. 一. json方法 1. 适合情况:  JSON对象的深度克隆.方法是先JSON.stringify() 转为json字符 ...

  4. js对象的所有方法

    Object构造方法 Object.assign() 将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象. Object.create() 用指定的原型对象和属性创建一个新对象. Object ...

  5. JS对象 返回星期方法 getDay() 返回星期,返回的是0-6的数字,0 表示星期天。如果要返回相对应“星期”,通过数组完成

    返回星期方法 getDay() 返回星期,返回的是0-6的数字,0 表示星期天.如果要返回相对应"星期",通过数组完成,代码如下: <script type="te ...

  6. JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值

    随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...

  7. Objective-C设计模式——工厂方法模式virtual constructor(对象创建)

    工厂方法模式 工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象. 工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的 ...

  8. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  9. js 对象的创建方式和对象的区别

    js一个有三种方法创建对象,这里做一个总结. 1.对象直接量 所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议, 1 2 3 4 5 6 7 8 9 10 11 12 ...

随机推荐

  1. [Hibernate] - Annotations - Many To Many

    Hibernate annotation 多对多: 下面测试例子会自动生成一张表:card,这张是bank和user表的映射表.里头是bank_id和user_id两个组合字段. 如果想在这张映射表中 ...

  2. UIview定义背景图片

    UIImage *image = [UIImage imageNamed:@"bgimagename"];    UIView *view = [[UIView alloc]ini ...

  3. 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 ...

  4. 6.25$post('',function(){});无法触发问题

    试了很久,发现把这个方法放错位置了

  5. ORA-04031案例一则

    ORA-04031这个错误,几乎每一个专业的DBA都遇到过.这是一个相当严重的错误,Oracle进程在向SGA申请内存时,如果申请失败,则会报这个错误.大部分情况下是在向SGA中的shared poo ...

  6. cent os下面的基本配置操作

    二,修改Linux分辨率命令行 在root用户模式下,输入$ vi /boot/grub/grub.conf(路径可能会不一样,也可以是 /etc/grub.conf),打开grub.conf文件 我 ...

  7. 调试压缩后的Javascript文件:在 Chrome 和 Safari ,选择“脚本”标签,找到相应的文件,然后点击“{}”图标(pretty print,在面板底部)

  8. C++ 常见崩溃问题分析

    一.前言 从事自动化测试平台开发的编程实践中,遭遇了几个程序崩溃问题,解决它们颇费了不少心思,解决过程中的曲折和彻夜的辗转反侧却历历在目,一直寻思写点东西,为这段难忘的经历留点纪念,总结惨痛的教训带来 ...

  9. 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/ ...

  10. linux命令(13) 删除指定文件夹下后缀名相同的文件

    方法一: find 目录 -name "*.abc" | xargs rm命令有点危险,可以先执行前半段,看看是不是你要删除的文件, 然后再整条执行 方法二:find . -nam ...