构造函数

new操作符实现原理

不打扰是莪最后的温柔 提交于 2020-03-04 17:19:55
new操作符实现原理: function news(func) { var target = {};//生成新对象 target.__proto__ = func.prototype;//实例的__proto__指向原型,构造函数的prototype也指向原型(链接到原型) var res = func.call(target);//把函数的this绑定在了新生成的对象中 if (typeof (res) == "object" || typeof (res) == "function") { return res;//如果传入的函数(构造函数)有自己的返回值,则返回该值 } return target;//如果如果传入的函数(构造函数)没有自己的返回值,则返回新对象 } 如果暂时看不明白,请往下看: 1.明白new的原理首先我们需要明白原型,构造函数,实例的关系 原型( prototype ):一个简单的对象,用于实现对象的属性继承。可以简单理解成对象的父亲。在火狐和谷歌中,每个js对象中都包含一个 __proto__ (非标准)的属性指向它爹(该对象原型),可obj.__proto__进行访问。 构造函数:可以 通过new来新建一个对象 的函数。 实例:通过 构造函数 和 new 创建出来的 对象 ,就是实例。实例通过 __proto__ 指向原型,通过 constructor

item 23: 理解std::move和std::forward

▼魔方 西西 提交于 2020-03-04 09:38:35
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢! 博客已经迁移到 这里啦 根据std::move和std::forward不能做什么来熟悉它们是一个好办法。std::move没有move任何东西,std::forward没有转发任何东西。在运行期,它们没有做任何事情。它们没有产生需要执行的代码,一byte都没有。 std::move和std::forward只不过就是执行cast的两个函数(实际上是函数模板)。std::move无条件地把它的参数转换成一个右值,而std::forward只在特定条件满足的情况下执行这个转换。就是这样了,我的解释又引申出一系列的新问题,但是,基本上来说,上面说的就是全部内容了。 为了让内容更加形象,这里给出C++11中std::move实现的一个例子。它没有完全遵循标准的细节,但是很接近了。 template<typename T> //在命名空间std中 typename remove_reference<T>::type&& move(T&& param) { using ReturnType = //别名声明 typename remove_reference<T>::type&&; //看Item 9 return static_cast<ReturnType>(param);

如何理解javascript中的对象

不羁的心 提交于 2020-03-03 16:17:48
以前对javascript中的对象总有不明白的地方,在本周也遇到了疑惑,于是借着机会去深入的了解了一下javascrpit中的对象。 创建对象 在javascript中,创建对象有两种方式,一种是使用 new 操作符后跟 Object 构造函数: let ob = new Object(); ob.name = 'object'; 另一种是直接使用对象字面值: let ob = { name: 'object' }; 这两种方式是等价的,虽然 Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同 一个接口创建很多对象,会产生大量的重复代码。在面向对象的设计语言中,通常通过创建类来解决这一问题。 创建类 我们可以通过自定义构造函数来实现javascript中的类: function Student(name) { this.type = 'student'; this.name = name; this.sayName = function() { console.log(this.name); } } let student1 = new Student('zhangsan'); student1.sayName(); // zhangsan let student2 = new Student('lisi'); student2

23种设计模式之原型模式

拟墨画扇 提交于 2020-03-03 09:16:08
原型模式的定义 定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象. 通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象 原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象是可拷贝的,为什么说是"标识" 呢? 翻开JDK的帮助看Cloneable是一个方法都没有的, 这个接口只是一个标记作用,在JVM中具有这个标记的对象才有可能被拷贝. 如何从"有可能被拷贝" 转换成"可以被拷贝"呢?方法是覆盖 clone 方法. 原型模式的通用代码: 原型模式的应用 原型模式的优点 性能优良. 原型模式是在内存二进制流的拷贝, 要比直接new 一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好的体现其优点 逃避构造函数的约束. 这既是它的优点也是缺点, 直接在内存中拷贝, 构造函数是不会执行的. 优点是减少了约束, 缺点也是减少了约束, 需要在实际应用时考虑 原型模式的使用场景 资源优化场景. 类初始化需要消化非常多的资源, 这个资源包括数据、硬件资源等 性能和安全要求的场景. 通过new产生一个对象需要非常繁琐的数据准备或访问权限, 则可以使用原型模式 一个对象多个修改者的场景. 一个对象需要提供给其它对象访问,

C++ Primer 学习笔记 第七章 类

依然范特西╮ 提交于 2020-03-03 05:59:05
类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术,类的接口包括用户所能执行的操作,类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。封装实现了类的接口和实现的分离,封装后的类隐藏了它的实现细节,即类的用户只能使用接口而不能访问实现部分。 类要想实现数据抽象和封装,首先需要定义一个抽象数据类型,在抽象数据类型中,由类的设计者负责考虑类的实现过程,而使用该类的程序员只需要抽象地思考类型做了什么,而无须了解类型的工作细节。 我们可以通过抽象数据类型提供的接口来完成某些操作,但如果一个类没有任何接口供用户使用,只有一些数据成员,那这个类就不是抽象数据类型,一旦定义了一些成员函数供类的用户使用,它就变成了了抽象数据类型。 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,但它的定义既可以在类的内部,也可以在类的外部。定义在类内部的函数是隐式的inline函数。 Sales_data类: struct Sales_data { string isbn ( ) const { return bookNo ; } Sales_data & combine ( const Sales_data & ) ; double avg_price ( ) const ; string bookNo ; unsigned units

JS new原理和代码实现

不打扰是莪最后的温柔 提交于 2020-03-03 01:17:46
示例: var Fn=function(){ this.name='hty' } const fn=new Fn; 当new Fn执行的时候,内部执行过程如下: 1、一个继承自Fn.prototype的新对象被创建。 2、使用指定的参数调用构造函数Fn,并将this绑定到新创建的对象。new Fn等同于new Fn(),也就是没有指定参数列表,Fn 不带任何参数调用的情况。 3、由构造函数返回的对象就是new表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤),这里需要注意,如果构造返回的不是对象,则不管return语句,返回步骤1创建的对象。 手动实现: var New =function(fn){ var obj={}; obj.__proto__=fn.prototype; // 将 arguments 对象转为数组 var args = [].slice.call(arguments); //去除构造函数 args.shift(); // 执行构造函数并改变this对象 var result = fn.apply(obj, args); if(Object.prototype.toString.call(result)=="[object Object]" ){

学习Javascript之模拟实现new

时光总嘲笑我的痴心妄想 提交于 2020-03-02 19:39:54
前言 本文1021字,阅读大约需要5分钟。 总括: 本文对new进行了一个简单介绍,然后使用一个函数模拟实现了new操作符做的事情。 参考文档: new 运算符 公众号:「前端进阶学习」,回复「666」,获取一揽子前端技术书籍 人生是没有毕业的学校。 正文 new 是JS中的一个关键字,用来将构造函数实例化的一个运算符。例子: function Animal(name) { this.name = name; } Animal.prototype.sayName = function() { console.log("I'm " + this.name); } var cat = new Animal('Tom'); console.log(cat.name); // Tom console.log(cat.__proto__ === Animal.prototype); // true cat.sayName(); // I'm Tom 从上面的例子可以得出两点结论: new 操作符实例化了一个对象; 这个对象可以访问构造函数的属性; 这个对象可以访问构造函数原型上的属性; 对象的**__proto__**属性指向了构造函数的原型; 由于 new 是关键字,我们只能去声明一个函数去实现 new 的功能,首先实现上面的三个特性, 第一版代码 如下: 附:对原型原型链不熟悉的可以先看

以基于Reactor模式的高并发EchoServer为例剖析muduo库框架

£可爱£侵袭症+ 提交于 2020-03-02 17:40:49
前言 在讲解基于muduo库的高并发echo服务器之前,我们先来回顾一下我们一般编写基于Reactor模式的高并发服务器的基本流程。 muduo的EchoServer其实也是基于上述流程,只不过进行了一定程度地封装,本质上仍是Reactor模式。muduo的example中的echo服务器代码展示的是只有一个reactor的服务器,muduo其实支持one loop per thread + 线程池的模式,也即multiple reactors + 业务线程池的模式,也就是服务器同时有多个IO线程,其中Acceptor所在的IO线程成为mainReactor,其他的IO线程成为subReactor,mainReactor主要负责处理监听描述符listenfd的上的时间,也就是负责处理客户端的连接请求。而subReactor主要负责已连接描述符connfd上的事件,也就是在和客户端建立好连接之后负责处理和客户端的具体通信。mainReactor+subReactor是由多个IO线程实现的,在muduo库当中,其通过在IO线程池中设置是让其工作在单IO线程模式还是多IO线程模式。而所谓的业务线程池主要是指计算线程池,其主要负责处理具体的业务逻辑,不涉及具体的IO操作。 在认真阅读完一遍muduo库源码之后,我认为如果想基于muduo库编写一个单线程版的echo服务器

Axon参考指南 - 3.命令处理 - Aggregate(聚合)

岁酱吖の 提交于 2020-03-02 17:21:59
简述 在本章中,我们将更详细地介绍Axon应用程序中处理和调度命令的过程。这里将涉及诸如聚合建模,外部命令处理程序,命令分派和测试之类的主题。 1. Aggregate 基本使用 聚合是一个常规对象,其中包含状态和更改该状态的方法。创建Aggregate对象时,您实际上是在创建“ Aggregate Root”,通常带有整个Aggregate的名称。出于此描述的目的,将使用“礼品卡”域,这使我们将GiftCard作为汇总(根)。默认情况下,Axon将您的聚合配置为“基于事件的”聚合(如此处所述)。此后,我们的基本GiftCard聚合结构将重点关注事件采购方法: import org . axonframework . commandhandling . CommandHandler ; import org . axonframework . eventsourcing . EventSourcingHandler ; import org . axonframework . modelling . command . AggregateIdentifier ; import static org . axonframework . modelling . command . AggregateLifecycle . apply ; public class GiftCard {

PowerMock和Mockito来mock

自闭症网瘾萝莉.ら 提交于 2020-03-02 11:23:04
简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参... 时间 2015-06-16 21:15:05 BlogJava-技术区 原文 http://www.blogjava.net/usherlight/archive/2015/06/16/425740.html 主题 Java 本文将简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值 一点简要说明:Mockito其实已经可以满足大部分的需求,但是它的实现机制是使用cglib来动态创建接口的类的实例。但是这种实现方式不能用于构造函数和静态函数,因为那需要使用类的字节码(比如使用javassist). 所以我们才需要结合使用PowerMock. 1. mock构造函数, 如果有代码没有使用DI注入依赖实例,在单元测试中可以使用PowerMock来模拟创建对象。 注意的开始两行的2个注解 @RunWith 和 @PrepareForTest @RunWith比较简单,后面始终是PowerMockRunner.class @PrepareForText后面需要加的是调用构造函数的类名,而不是有构造函数的类本身。 在下面的例子中,我们要测试的类是:Helper,