博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript——构造函数模式
阅读量:5033 次
发布时间:2019-06-12

本文共 1511 字,大约阅读时间需要 5 分钟。

var o = new Array();

我们创建了一个对象,这个对象是个数组类型,Array就是一个原生构造函数。显而易见,构造函数模式就是让我们知道如果我们要创建一个Person(),如何能使它像Array()一样可以通过new一个类来创建对象实例,且这个对象实例被标记为Person类型

function Person (name, age, job){    this.name=name;    this.age=age;    this.job=job;    this.sayName = function(){        alert(this.name);    };}var person1= new Person("guoshiwei", 23, "web");var person2 = new Person("Nicholas", 29, "Software Engineer");

这段代码使用构造函数模式,通过构造函数模式创建实例的时候,必须使用new操作符,通过new操作符,实例就被标识为Person类型(构造函数最大的好处)

注意:

Person 首字母要大写,因为构建函数模式它本身也是一个函数,为了区别,构建函数模式的函数首字母大写

 

通过new创建新实例的过程如下(注释后为个人理解)

  1. 创建一个新对象;        //在内存中开辟一个空间  object类型对象  所有还没有定义的对象都是object对象
  2. 将构造函数的作用域赋给新对象(因此this就指向了这个新对象);//将Person类中的类或方法复制一份放到这个空间中去,此时这个对象变成  Person类型对象  constructor属性指向Person  表明你得到的这些属性和方法来自哪
  3. 执行构造函数中的代码(对这个新对象添加属性);     //把你的参数代入到这个空间的属性或方法中
  4. 返回新对象;    //把这个对象连接到person1上 

 

到此为止,一个Person类型的person1对象实例就完成了,但是注意到的是,通过new操作符创建的对象实例,第二步时,我的理解是它是将Person类中的属性和方法复制一份给自己,而不是引用来自Person的属性和方法。(每个属性和方法都是自己的)

alert (person1.sayName == person2.sayName);   //false

这就造成了一种不方便(我理解为浪费),那就是每创建一个实例,都要重新生成一个sayName函数。

function Person (name, age, job){    this.name=name;    this.age=age;    this.job=job;    this.sayName=sayName;
}function sayName(){    alert(this.name);}var person1=new Person("guoshiwei", 23,"web");var person1=new Person("Nicholas", 29,"Software Engineer");

你可以这样在函数外创建sayName函数,这样person1和person2都通过sayName对象引用sayName()方法,但是如果你还需要sayAge, sayJob函数就显的比较麻烦了,一旦你需要的方法多了,就得不偿失,而且降低了Person函数的封装性,所以为了解决这个问题,又出现了一种新的模式——原型模式

 

转载于:https://www.cnblogs.com/guoshiwei/p/4897691.html

你可能感兴趣的文章
Kubernetes1.3:POD生命周期管理
查看>>
JS获取浏览器信息及屏幕分辨率
查看>>
关于React中props与state的一知半解
查看>>
Codeforces Round #427 (Div. 2)
查看>>
Codeforces 295E Yaroslav and Points 线段树
查看>>
java中Hashtable和HashMap的区别(转)
查看>>
关闭数据库
查看>>
webStrom智能提示忽略首字母大小写问题
查看>>
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
kali 2018.1安装教程
查看>>
iOS CGRectGetMaxX/Y 使用
查看>>
COCO 数据集使用说明书
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
.NET(C#):分析IL中的if-else,while和for语句并用Emit实现
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
LinkedList
查看>>
Oracle数据库的增、删、改、查
查看>>