不要惧怕不熟悉的文字,加油!

1.工厂模式

function person(name,age){var obj = {};obj.name = name,obj.age = age,obj.sayName = function(){alert(this.name)}return obj
}
var person1 = person('yxy',20);
var person2 = person('yay',10);

注:工厂模式的特点:
1. 在函数中声明对象
2. 用return返回该对象
3. 直接调用函数

2.构造函数模式

function Person(name,age){ this.name = name,this.age = age,this.sayName = function(){alert(this.name)}
}
var person1 = new Person('yxy',20);
var person2 = new Person('yay',10);

注:构造函数的特点:
1.构造函数要用大驼峰 //推荐
2. 无需在构造函数中声明对象,没有return语句
3. 直接将属性和方法绑定到了this对象上
4. 使用new调用
此时,person1和person2的构造器(constructor)都指向了Person,也指向Object,

person1 instanceof Person;//true
person2 instanceof Person;//trueperson1 instanceof Object;//true
person2 instanceof Object;//true

有没有发现在构造函数的模式里,sayName的方法被创建了两次,每new一个实例的时候,就创建了一次sayName,so...

function Person(name,age){ this.name = name,this.age = age,this.sayName = sayName;
}
//将sayName 作为全局方法
function sayName(){alert(this.name);}
var person1 = new Person('yxy',20);
var person2 = new Person('yay',10);person1.sayName == person2.sayName;//true true就表示被执行了一次哦~

3.原型模式

由于在全局作用域中定义的sayName函数仅仅是被某个对象调用,非常小题大作,so...可以用原型模式来解决

function Person(){ }
Person.prototype = {constructor:Person,//由于重写了构造函数的原型后,原有的constructor被重写了,所以需要再给它指向一下Personname:'yxy',age:20,sayName:function(){alert(this.name)}
}var person1 = new Person();
var person2 = new Person();

注:原型模式的特点:
1. 将属性和方法都赋到原型对象上

4.组合模式(构造函数模式+原型模式)

上述的原型模式中,如果其中某个属性是引用类型,创建的实例会共享这些属性,加一个friends属性,如:

Person.prototype = {constructor:Person,name:'yxy',age:20,friends:['Hccc1','Zh','Y'],sayName:function(){alert(this.name)}
}var person1 = new Person();
var person2 = new Person();
person1.friends.push('little A');
console.log(person1.friends);//["Hccc1", "Zh", "Y", "Li"]
console.log(person2.friends);["Hccc1", "Zh", "Y", "Li"]

发现了吧,属性被共享了,解决办法就是用组合模式(最好的模式):

function Person(name,age){ this.name = name;this.age = age;this.friends = ['Hccc1','Zh','Y'];
}
Person.prototype = {  constructor:Person,sayName:function(){alert(this.name);}
}var person1 = new Person('yxy',20);
var person2 = new Person('yay',10);
console.log(person1.friends);// ["Hccc1", "Zh", "Y"]
console.log(person2.friends);// ["Hccc1", "Zh", "Y"]
person1.friends.push('AAA');
console.log(person1.friends);// ["Hccc1", "Zh", "Y", "AAA"]
console.log(person2.friends);// ["Hccc1", "Zh", "Y"]

棒!

转载于:https://www.cnblogs.com/geekfeier/p/7724414.html

笨笨对面向对象的理解相关推荐

  1. 木老师教笨笨课堂——系列讲座(从函数指针到委托) 三、C++语言里的函数指针...

    先来回顾一下,我们说函数指针有一个重要的特性,它可以指向任何形参相同的函数.这样可以用统一的方式去调用不同的函数.(这个我还是希望笨笨同学好好思考一下,我想也是程序思想的精髓之一吧),就好比武功秘籍中 ...

  2. 第15.39节、splitDockWidget和tabifyDockWidget嵌套布局QDockWidget的PyQt人机对话案例:笨笨机器人

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在第<第三十一章.containers容器类部件QDo ...

  3. 原创:纯手工打造CSS像素画--笨笨熊系列图标

    纯手工打造CSS像素画--笨笨熊系列图标 作者:冰极峰 转载请注明出处 在cssplay网站看到有一组CSS像素画,于是也想摩仿一下,于是在网络上找到一组头像图标,看其结构比较简单,就拿它开刀吧!先看 ...

  4. JavaScript面向对象——深入理解寄生组合继承

    JavaScript面向对象--深入理解寄生组合继承 之前谈到过组合继承,会有初始化两次实例方法/属性的缺点,接下来我们谈谈为了避免这种缺点的寄生组合继承 寄生组合继承: 思路:组合继承中,构造函数继 ...

  5. vmware nat模式网络不通_笨笨狗教你如何解决VMware虚拟机桥接网络不通问题?

    笨笨狗教你如何解决VMware虚拟机桥接网络不通问题? 背景介绍 在我们日常使用Kali Linux时,有时候我们将虚拟机网络连接方式设置为桥接后发现虚拟机Kali Linux无法ping通网络,或者 ...

  6. 笨笨图片批量下载器 V0.3 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程] new...

    前言 从[笨笨图片批量抓取下载 V0.2 beta]到[笨笨图片批量下载器 V0.3 beta]时间将近2个月,不是说这个升级版本开发了这么久,实在是懒,呵呵: )再加有时候工作忙.学习,多的时间就不 ...

  7. 笨笨工作室告别十月模拟赛

    笨笨工作室告别十月模拟赛 为了大家适应今年复赛电子版题目特意整理了一份电子版题目: /Files/hhdllhflower/笨笨工作室告别十月模拟赛.rar Chess Background 笨笨:& ...

  8. 木老师教笨笨课堂——系列讲座(从函数指针到委托) 四、C#的委托

    四.C#的委托 ".Net以委托的形式实现了函数指针的概念."--<C#高级编程(第四版)> 现在看这句话,可能笨笨同学就有感觉了. 看书可能就是这样,想当初天山童姥的 ...

  9. Vijos P1571 笨笨的导弹攻击【最长上升子序列+DP】

    背景 在那遥远的地方,有个小目标-- 笨笨:导弹准备! 路人甲:(这么小个目标都要欺负--)老大,导弹只有一部分可以用-- 笨笨:不管那么多,有多少就打多少! 描述 为了彻底打击目标,笨笨要使用足够多 ...

  10. jquery开发的”天才笨笨碰“游戏

    前段时间湖南卫视的快乐大本营里有一款"天才笨笨碰"游戏非常火.这款游戏主要是考选手的声母联想词语的能力. 小篇在看完这个节目后用jquery制作了"天才笨笨碰" ...

最新文章

  1. html中双重id标签怎么写,PHP读取HTML并处理双重ID外观
  2. 使用windows调用Linux远程桌面
  3. Python命名空间和作用域
  4. 南京工业大学浦江学院计算机学院,招生季 叮~让你爱上南京工业大学浦江学院的若干个理由...
  5. Linux centos开机执行JAR Shell脚本
  6. Jupyter更改主题和字体及远程访问
  7. 如何在5分钟内发现 SQL 语言中的数据血缘
  8. 魔兽世界插件开发-暴雪设计工具/命令
  9. HTMl悬浮播放器XPlayer,XPlayer万能视频播放器
  10. Updates were rejected because the tip of your current branch is behind hint: its remote counterpart
  11. 用python预测小孩的身高_Python 孩子身高预测
  12. Redis trouble21 -- aof持久化导致redis命令阻塞
  13. 蜂鸣器发出兰花草c语言程序,兰花草源程序
  14. 计算机双击打不开看不见盘符,双击盘符打不开最简单的解决办法
  15. 使用YOLOv5实现多路摄像头实时目标检测
  16. RFID在物流行业中的应用框架
  17. 【完整记录】使用kubeadm部署kubernetes集群踩坑记录及解决方案
  18. 2020年复旦大学计算机学院夏令营面经
  19. NPOI方式 导出Excel表头
  20. 如何用golang编写单元测试用例

热门文章

  1. Visual Basic专题(VB356套)--项目设计-毕业设计【建议在校生收藏】
  2. SDI接口基于FPGA GTP实现
  3. 西部数据NAS家族再添新成员:WD Red 4TB
  4. VGG(visual geometry group,超分辨率测试序列)
  5. 计算机就职行业分类,计算机行业分类
  6. java计算机毕业设计汽车售后服务管理系统源码+程序+lw文档+mysql数据库
  7. 安装jdk8出现无法定位程序输入点regdeletekeyexa于动态链接库ADVAPI32.dll上
  8. psp记忆棒测试软件,识别4GB PSP记忆棒真伪的方法
  9. IE浏览器打不开了...
  10. RPA应用案例,泰隆银行引领智慧金融新风向