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

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. MongoDB七-运维技术

    复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/03/08/2384571.html 这一篇我们以管理员的视角来看mongodb,作为一名 ...

  2. hdu 2583 How far away ? 离线算法 带权求最近距离

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. 使用FragmentStatePagerAdapter时发现的内存泄露问题

    这篇文章想说的并非是由于使用 FragmentStatePagerAdapter 而导致的内存泄漏,内存泄漏的真正原因和 FragmentStaePagerAdapter 并无直接关联,但是使用 Fr ...

  4. PowerDesigner 破解版,汉化包!

    链接:https://pan.baidu.com/s/1R_6g6keo2Y4_V0c1ImeFbA  密码:ncju

  5. HTML条件注释判断<!--[if IE] ![endif]-->

    很多网页中会见到这样的代码: <!--[if IE 7]> <![endif]--> /*或者*/ <!--[if lt IE 9]> <![endif]-- ...

  6. 美素数(HDU 4548)(打表,简化时间复杂度)

    相信大家都喜欢美的东西,让我们一起来看看美素数吧. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数",如29,本身是素数,而且2+9 = 11 ...

  7. PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]

    题目 Input our current position and a destination, an online map can recommend several paths. Now your ...

  8. 常用sql语句(mysql测试)

    DB数据库,DatabaseDBMS数据库管理系统,DatabaMemanagmentSystemSQL结构化查询语言,structure Query Language 开启服务net start m ...

  9. 使用文件流创建File文件和目录以及其他的一些操作

    我们创建文件时可以直接通过File f=new File(path)来创建一个文件对象,然后再通过 f.createNewFile() 就创建出来了一个文件.比如设置 path 为 C:\Users\ ...

  10. POJ 1062:昂贵的聘礼

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 40715   Accepted: 11839 Descripti ...