JavaScript创建对象模式
来源:互联网 发布:p2717h 知乎 编辑:程序博客网 时间:2024/04/26 16:39
要在JavaScript中创建一个对象,最简单的是直接使用字面量来创建,可是这么做在对象较多时会产生大量重复的代码,由此引发了创建对象模式的产生。这些模式就是用来产生对象的。
工厂模式
批量产生js对象
function createPerson(name) { var o = new Object(); o.name = name; o.sayName = function() { return this.name; }; return o;}var person = createPerson("foo");
利用这个函数调用一次产生一个对象,确实很方便。
可是问题在哪呢,属性每个对象一个可以接受,可是方法每个对象也都一个太重复了。因为js中函数也是对象,不像Java会将方法放到静态方法区。js是将函数作为对象的一部分一起存储的。这太浪费了。
构造函数模式
看一下例子
function Person(name) { this.name = name; this.sayName = function() { return this.name; };}var person = new Person("foo");
构造函数模式同样存在和工厂模式一样的问题。从本质上讲构造函数就是一种工厂模式。只不过一些共有的步骤都默认执行了(创建对象,返回对象)。
那构造函数好在哪呢。好久好在名字上,也可以说是标志。工厂模式产生的全部是Object。而构造函数产生的则有了自己的标志Person,多么霸气的名字。这样不同的构造函数产生的对象不就区分开了嘛。你工厂模式可以吗?
所以可以将构造函数模式看成是工厂模式的升级版,不再是黑工厂!
原型模式
原型是一个js对象。可以看作是java里的基类。构造方法只是小兵好嘛,真正的幕后主使其实是原型。
原型里面有个方法叫做constructor就是我们说的构造方法。constructor(函数是对象)又有一个属性prototype就是这个原型。
通过构造方法产生的实例都会有内部属性[[Prototype]],就是他们可以知道自己的原型就是那个。感觉就像借腹生子?
原型模式就是把所有的属性和方法都添加到原型上,而构造函数为空。那每个产生的对象肯定也都是空空如也。js在对象中找不到属性或者方法就会去原型中找。
看例子
function Person() {}Person.prototype.name = "foo";Person.protorype.sayName = function() { return this.name;}var person = new Person("foo");
这样我们就可以产生对象了,而且方法只在原型中存在哦,没浪费,但是坏处就是所有的对象共享原型中的属性和方法!
那我们一般肯定是不希望所有的对象共享一个属性,那怎么破呢,构造方法不就可以让每个对象都有自己的属性了吗,由此就产生了组合使用构造函数模式和原型模式。
组合使用构造函数模式和原型模式
看个例子就明白
function Person(name) { this.name = name;}Person.prototype.sayName = function() { return this.name;}var person = new Person("foo");
完美,每个对象都有自己的name属性(因为都是用构造函数创建的),又都可以调用原型中的sayName函数。这才是我们想要的对象!
动态原型模式
上面的组合使用构造函数和原型模式虽然已经很棒,可是还可以稍稍改进一下。
function Person(name) { this.name = name; if (typeof this.sayName !== "function") { Person.prototype.sayName = function() { return this.name; } }}var person = new Person("foo");
如果原型上添加过了就不再添加。本质还是组合使用。
在实际中我们使用这种模式来创建js对象。
寄生构造函数模式
感觉这个模式和工厂模式没区别
function Person(name) { var o = Object(); o.name = name; o.sayName = function() { return this.name; }; return o;}var person = new Person("foo");
感觉唯一的不同就是可以通过new 来调用,但是和工厂模式一样不能确定具体是哪个类的实例。感觉没卵用。
稳妥构造函数模式
function Person(name) { var o = new Object(); o.sayName = function() { alert(name); //对name属性操作一番,就是不传出去 }; return o;}var person = new Person("foo");
由此创建的对象只能有一种方式操纵name属性,那就是调用sayName方法。这样就安全了,对象只能按照预先设定的方法来操作属性。所以叫稳妥构造函数模式。
以上就是暂时学习到的js创建对象的模式。
- JavaScript对象创建模式
- JavaScript创建对象模式
- javascript对象创建模式
- JavaScript创建对象---工厂模式
- JavaScript 创建对象的模式
- JavaScript 创建对象---工厂模式
- JavaScript 创建对象---原型模式
- 《JavaScript模式》--第五章:对象创建模式
- Javascript中创建对象的各种模式
- javascript创建对象的几种模式
- javascript创建对象的几种模式
- Javascript创建对象的基本模式
- javascript 对象创建模式 之 builder
- javascript 对象创建 之 抽象工厂模式
- JavaScript动态混合模式创建对象
- JavaScript创建对象的7种模式
- JavaScript创建对象的几种模式
- JavaScript 创建对象模式与最佳实践
- Android商城App购物车规格联动选择
- L1-012. 计算指数 java
- Memcached+magent集群安装及错误处理
- com.sun.faces.config.ConfigureListener
- 简单实现 Android M 指纹识别(附源码)
- JavaScript创建对象模式
- Vijos 1565 多边形 【区间DP】
- php 中的数组类型
- Vue路由开启keep-alive时的注意点
- 从.properties配置文件中读取url路径(jdbc的参数和接口请求url)
- mysql_general_log(查看mysql执行历史)
- 设计模式概要简介
- 最经典的25本Python编程开发电子书(附下载地址)!
- 加密Unity的windows版本Assembly-CSharp.dll的实现