文档章节

JavaScript创建对象(四)——组合使用构造函数和原型模式

Bob2100
 Bob2100
发布于 2018/10/13 12:07
字数 718
阅读 34
收藏 0

JavaScript创建对象(三)——原型模式中,我们阐述了原型模式存在的两个问题:一是没办法通过构造函数初始化对象属性,二是共享引用类型的数据导致数据错乱。于是我们提出组合使用两种模式,摒弃它们的缺点,保留它们的优点。

为了解决构造函数模式相同功能的函数定义多次的问题,我们提出了原型模式。但是不要忘记,构造函数模式也具备原型模式所缺乏的优点,比如可以通过构造函数初始化对象的属性,同时也没有共享引用类型的数据错乱问题。既然我们提出原型模式是为了解决构造函数模式的函数问题,那为什么我们不只把函数定义在原型中,属性依然保留在构造函数中呢?顺着这个思路,我们来看下面的代码:

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = ['小明', '小刚'];
}

Person.prototype = {
    constructor: Person,
    sayName: function(){
        console.log(this.name);
    }
}

var p1 = new Person('张三', 18, 'JavaScript');
var p2 = new Person('李四', 20, 'Java');

p1.friends.push('小红');
console.log(p1.friends);//["小明", "小刚", "小红"]
console.log(p2.friends);//["小明", "小刚"]

console.log(p1.friends === p2.friends);//false
console.log(p1.sayName === p2.sayName);//true

还是原来的例子,只不过把一些不需要共享的属性保留在构造函数中,需要共享的属性定义在原型中,这就是组合使用构造函数和原型模式。我们可以看到,首先可以通过构造函数初始化对象属性了。其次,因为属性是定义在构造函数中,每次通过new关键字创建对象都会执行一次构造函数,所以对于每个对象来说就都有了属于自己的属性了。比如这里,p1friends新增了一个小红,p2friends并不会受到影响,因为它们是两个数组。再者,一些需要共享的属性依然定义在原型中,避免了重复定义,可谓是集两种模式之长。

这种构造函数与原型集成的模式,是目前在JavaScript中使用最广泛、认同度最高的一种创建自定义类型的方法。可以说,这是用来定义引用类型的一种默认模式。

本文参考《JavaScript高级程序设计(第3版)》

© 著作权归作者所有

共有 人打赏支持
Bob2100
粉丝 22
博文 78
码字总数 39165
作品 0
浦东
高级程序员
私信 提问
JavaScript继承(二)——借用构造函数

JavaScript继承(一)——原型链中提出原型链继承的两个问题:一是原型的数据共享问题,二是创建子类型的实例时,不能向父类型的构造函数中传递参数。这两个问题的根源还是在于使用原型模式创...

Bob2100
01/20
0
0
JavaScript创建对象(五)——动态原型模式

对于有其他面向对象语言开发经验的人来说,在看到独立的构造函数和原型时,很可能会感到非常困惑。比如在Java中(没有Java经验的开发者此段可忽略,只要知道后面提出的结论就好了),有类的概...

Bob2100
2018/11/05
0
0
JavaScript继承(五)——寄生式继承

首先回顾一下原型式继承: 寄生式继承是与原型式继承紧密相关的一种思路,并且同样也是由克罗克福德推而广之的。 说到寄生式继承不得不说工厂模式和寄生构造函数模式创建对象。下面来回顾一下...

Bob2100
02/13
0
0
JavaScript继承(六)——寄生组合式继承

JavaScript继承(三)——组合继承中讲到,组合继承是JavaScript中最常用的继承模式,但是它也有自己的不足之处,现在我们就来剖析它的不足,如下示例: 使用组合继承让继承实际上分为两步:...

Bob2100
02/16
0
0
JavaScript 中的继承:ES3、ES5 和 ES6

选择一种继承方式 JavaScript 是一门动态语言,动态意味着高灵活性,而这尤其可以体现在继承上面。JavaScript 中的继承有很多种实现方式,可以分成下面四类: Mixin 模式,即属性混入,从一个...

天方夜
2018/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

人生道路由什么决定

1. 坐在家里看会电视剧,觉得挺好看的,但是心里面不踏实,不舒服,觉得自己应该学习东西,研究工作内容。 2. 上次面试遇到的问题,让我认识到,工作中不仅仅要解决问题,还应该把工作中用到...

kuchawyz
10分钟前
3
0
分析java程序

最近公司的一个账单推送的服务,发现有延迟。我排查的时候发现,有一个程序日志不动了(采用消息队列,部署了两台服务器来负载均衡)。 网上说: jstack 可以来排查。 可以观察到jvm中当前所...

miaojiangmin
14分钟前
1
0
android camera(一):camera模组CMM介绍

这篇比较基础,做为科普知识看一下。 android camera(一):camera模组CMM介绍 android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF) android camera(三):camera V4L2 FIMC an...

天王盖地虎626
17分钟前
1
0
CDH整合zeppelin

CDH二进制安装zeppelin-0.8.0: 在下载地址1,下载zeppelin-0.8.0-bin-all.tgz 上传服务器,解压tar -zxvf zeppelin-0.8.0-bin-all.tgz cd zeppelin-0.8.0-bin-all/conf/ cp zeppelin-env.sh......

hblt-j
21分钟前
1
0
CMF5 图片上传并保存到七牛云

/** * 上传图片并保存到七牛云 */ public function uploadPic(){ //接收文件 $file=request()->file('file'); if($file==null){ ......

小小小小小胖丶
22分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部