构造函数模式与原型模式结合

function Person(name) = {
this.name = name
this.friends = ["a", "b"]
} person.prototype = {
constructor: Person,
sayName: function() {
alert("this.name")
}
} var p1 = new Person("hi")

但是这很让人困惑。因为构造函数和原型模式单独书写。不符合面向对象的封装。

//因为构造函数会初始化原型,所以原型模式不能书写到构造函数中,因为这样每创建一次实例都会重新定义一下原型函数

解决方案 动态原型模式

所有的都封装在构造函数中,通过在构造函数中初始化原型(仅在必要的时候。就是可以添加一个判断)

function Person(name) = {
//属性
this.name = name
this.friends = ["a", "b"]
//方法
if (typeof this.sayName != "function") {
person.prototype.sayName =function() {
alert(this.name);
}
}
} var p1 = new Person("hi")

这段代码只会在初次调用构造函数的时候才会执行,此后原型已经完成了初始化。这里在原型中做的修改,能够立即体现在所有的实例中。

原型的动态性:我们对原型对象所做的任何修改,都能够立即从实例上反应出来

寄生构造函数(一个特殊的用法)

  • 特殊的情况为对象创建构造函数。假设在不修改Array构造函数的前提下,创建一个具有额外方法的特殊数组
  • 返回的对象与构造函数活着构造函数的原型没有任何关系
  • 构造函数在不返回值的情况下,会默认返回新对象实例。如果又一个return,就重写构造函数的返回值

总结

function SpecialArray(){
//创建数组
var vlaues = new Array();
//添加值
vlaues.push.apply(values, arguments);
//添加方法
values.toPipedString = function(){
return this.join("|");
};
//返回数组
return values;
} var colors = new SpecialArray("red", "blue", "green");
alert(colors.toPipedString()); //"red|blue|green"

寄生构造函数模式的目的是实现在不改变原有构造函数的前提下为构造函数添加特殊的方法,这个构造函数的功能就是传入参数,生成一个数组对象,并且这个数组自带SpetialArray方法,而且返回的对象跟构造函数和构造函数的原型对象没有什么关系;

这里演示的是附带special方法, 下次附带数组不具有的方法呢?所以不必纠结join;

为什么没有使用原型方法,开篇就提到了,不改变原有构造函数的前提下,添加新方法,你修改了Array的prototype,所有Array实例都会继承这样一个方法,得不偿失;

比如遇到某个场景:你想创建一个字符串,String字符串自带某种方法可以返回一段复合要求的字符串,你不能直接在String原型上定义该方法,因为这样所有的字符串都会继承这个方法没有必要,但是你又不想每次都调用封装的函数,寄生构造函数就能派上用场了,在创建对象的时候就给这个字符串赋予了你需要调用的方法,同时有不影响String这个全局构造函数

是这样的,Array想要把argements全部push的话,必须要遍历arguments,arguments只是类似数组,但事实上是一个对象,所以push  arguments返回的是一个包含单个对象的长度为1的数组,apply把数组的push方法施加到一个数组上,接收的第二个参数是一个数组,所以直接跳过遍历,一次性全部push了

寄生构造函数专门用来为js原生的构造函数定义新的方法

function SpecialArray(){
var values = new Array();
values.push.apply(values, arguments);
values.toPipedString = function(){
return this.join("|");
}
return values;
}
var a = new SpecialArray(2,6,8,9,4);
a.toPipedString();
var b = SpecialArray(2,6,8,9,4);
b.toPipedString();

寄生构造函数模式和工厂模式没有本质区别,通过new 操作符的就叫寄生构造函数模式,直接调用的就叫工厂模式

JS里的构造函数就是一个用来构造对象的普通函数,和JAVA不同

你要知道,通过new 来调用函数,会自动执行下面操作

  1. 创建一个全新的对象

  2. 这个对象会被执行[[prototype]]连接原型

  3. 函数调用中的this会绑定到新对象

  4. 如果函数没有返回其他对象,那么new 构造就会自动返回这个新对象

由于这里new调用和直接调用都返回values,所以a,b引用的数组对象是一样的

面向对象 part5的更多相关文章

  1. Java实例 Part5:面向对象入门

    目录 Part5:面向对象入门 Example01:成员变量的初始化值 Example02:单例模式的应用 -----懒汉式 -----饿汉式 Example03:汉诺塔问题的求解 Example04 ...

  2. day 25 面向对象之接口、抽象类、多态、异常处理、反射、断言

    复习 '''继承​1.父类:在类后()中写父类们class A:passclass B:passclass C(A, B):pass​2.属性查找顺序:自己 -> ()左侧的父类 -> 依 ...

  3. python基础——18(面向对象2+异常处理)

    一.组合 自定义类的对象作为另一个类的属性. class Teacher: def __init__(self,name,age): self.name = name self.age = age t ...

  4. python语言(七)面向对象、异常处理

    一.异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常).程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关).如果捕捉成功则进入另外一个处理分 ...

  5. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  6. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  7. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  8. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  9. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

随机推荐

  1. tomcat conf目录下server.xml详解

    一.   一个server.xml配置实例 1 <Server port="8005" shutdown="SHUTDOWN"> 2 <Lis ...

  2. 14 SQLite数据库

    SQLite数据库SQLite 是一款轻型的数据库SQLite 的设计目标是嵌入式的SQLite 占用资源低SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 ANSI 的标准计算机 ...

  3. Spring 控制反转容器(Inversion of Control – IOC)

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  4. java基础源码 (4)--reflect包-AnnotatedElement接口

    接口:AnnotatedElement * Represents an annotated element of the program currently running in this * VM. ...

  5. Web基础之Servlet

    Servlet Servlet : server applet,直译服务小程序.那Servlet到底是什么呢? Servlet说白了其实就是一个接口,接口的作用是什么?规范呗,这个接口规定了下面三个问 ...

  6. 中国移动携手华为百度展示5G应用,实现8K视频传输

    在今日举行的 2019 年百度云智峰会上,中国移动携手华为和百度,首次展示基于 SA 架构的 5G Vertical LAN (行业局域网)技术,承载 8K 实时会议系统,助力企业云办公.该技术可为合 ...

  7. POJ 2481:Cows 树状数组

    Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14906   Accepted: 4941 Description ...

  8. 【shell】常用shell脚本

    1.检查主机存活状态 #!/bin/bash IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2" for IP in $IP_LIST; ...

  9. 使用IDEA打对应结构的Jar包

    发布环境的内容和自己项目默认打包的样式不一样,就需要自定义打印jar包内容. 1.打开右上角项目结构 2.进行图片相关设置 3.直接进行打包,包会出现在class文件里面.解压软件解压开就是自己想要的 ...

  10. df 、dh

    查看磁盘 不挂载获取文件系统 [root@localhost ~]# file -s /dev/sda1/dev/sda1: SGI XFS filesystem data (blksz 4096, ...