1、Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。

var _this = Object.create(fn.prototype);这句代码的意思是fn的prototype属性内容作为新对象的原型内容。

2、apply方法会改变this的指向。原本fn函数中调用时,也就是这样fn(),this指向的是window,但是这样使用之后fn.apply(_this, args); _this指向的是上面新创建的对象,所以改变了fn中this的指向,新对象也就有拥有了fn中的属性 。可以理解为新对象继承了fn中的属性。args是参数,必须是数组的形式,name和age属性也就有了值。

3、return中是一个三元运算,res是否存在,如果存在就返回,不存在就返回_this 。

实例化对象有一个属性叫做__proto__(原型),构造函数上有一个属性叫做prototype(原型对象)。在构造函数实例化的时候,构造函数会把prototype上面的方法和属性,复制到实例化对象的__proto__上。所以实例化对象,继承了构造函数原型上的方法和属性。

一个函数只有通过new实例化之后,才叫做构造函数。

若构造函数中没有返回值或返回值是基本类型(Number、String、Boolean)的值,则返回新实例对象;若返回值是引用类型的值,则实际返回值为这个引用类型。

apply方法会改变this的指向。原本fn函数调用时,也就是fn()这种写法,this指向的是window,但是fn.apply(_this, args)这种写法 _this指向的是上面新创建的对象,所以改变了fn中this的指向,新对象也就有拥有了fn中的属性 。可以理解为新对象继承了fn中的属性。args是参数,必须是数组的形式,name和age属性也就有了值。

            //当使用new关键字去调用那个函数的时候,那这个函数就会被作为构造函数去进行调用,然后它会走构造函数的一套流程去执行这么一个函数
//在这里调用构造函数的样子跟其他语言去实例化一个类的方式也很像,都是使用new关键字,所以很容易造成混淆
//推荐写class //在js中创建一个对象的方式是很多的,构造函数也是其中的一种方式
// const obj = {}
// new Object();
// Object.create(); //使用new关键字调用一个函数,这个函数就会被当做构造函数进行调用
function Person(name,age){
this.name = name;
this.age = age;
}
//如果它没有返回值就会返回出一个对象
//不妨思考一下返回的对象是怎么出现的,为什么它上面有张三跟11
const p =new Person('张三',11)
console.log(p)
//p.__proto__是等于Person.prototype,这也证明了第二步,把构造函数的prototype属性作为空对象的原型。 console.log(p.__proto__ == Person.prototype) //true




            //当用new关键字调用函数的时候,发生了什么,为什么会获得一个新的对象

            // 1.创建一个空的对象
// 2.把构造函数的prototype属性(Person.prototype) 作为空对象的原型,这样空对象就可以访问到Person.prototype上面的方法了
// 3.this赋值为这个空对象
// 4.执行函数
// 5.如果函数没有返回值,则返回this(也可以说是返回之前那个空对象) //把一个函数变成构造函数:
function Constructor(fn,args){
//fn表示要作为构造函数的函数,args表示要调用fn这个构造函数时需要传递给它的一些参数 //1.创建空对象
var _this = Object.create(fn.prototype); //以fn.prototype为原型创建的一个空对象 //第一个参数表示fn函数内部的this指向的对象,第二个参数是传入fn函数的参数 //fn函数是window对象调用的,所以this指向的是window ,然后使用apply方法,改变this指向创建的Person 对象。
var res = fn.apply(_this, args);
console.log(res) //输出undefined,为什么? //如果有res就返回res,如果没有就返回创建的对象
return res ? res : _this;
} function Person1(name,age){
this.name = name;
this.age = age;
}
Person1.prototype.say = function(){
console.log('我叫' + this.name);
} var person = Constructor(Person1, ['李四',21])
console.log(person)


在ES5中模拟类的更多相关文章

  1. Es5中的类和静态方法 继承

    Es5中的类和静态方法 继承(原型链继承.对象冒充继承.原型链+对象冒充组合继承) // es5里面的类 //1.最简单的类 // function Person(){ // this.name='张 ...

  2. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. ES5中的类与继承

    最近在重新复习TypeScript,看到类这块的时候自然会和ES5中的类写法进行对比加深印象. 发现ES5的类与继承一些细节还是挺多的,时间久了容易忘记,特此记录下. 首先是ES5的类定义,这没什么好 ...

  4. ES5中的类

    之前小编对于类和类的基本特征(所谓的封装.继承.多态)理解一直不是很到位,同时在实际项目应用中也用的比较少,今天小编就结合ES5中的基本用法和大家聊聊,希望小伙伴会在这篇文章有属于自己的收获,并能够在 ...

  5. Typescript中的类 Es5中的类和静态方法和继承(原型链继承、对象冒充继承、原型链+对象冒充组合继承)

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. ES6中的类

    前面的话 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScri ...

  7. koa 基础(十七)原生 JS 中的类、静态方法、继承

    1.app.js /** * 原生 JS 中的类.静态方法.继承 * es5中的类和静态方法 */ function Person(name, age) { // 构造函数里面的方法和属性 this. ...

  8. 《深入理解ES6》笔记—— JavaScript中的类class(9)

    ES5中的近类结构 ES5以及之前的版本,没有类的概念,但是聪明的JavaScript开发者,为了实现面向对象,创建了特殊的近类结构. ES5中创建类的方法:新建一个构造函数,定义一个方法并且赋值给构 ...

  9. 在 JavaScript 中使用构造器函数模拟类

    今天,我们要讲的是在 JavaScript 中使用构造器函数(construcor function)模拟类. 构造器函数简介 你可以使用 ES6 的 class 关键字来实现类,不过我建议你使用传统 ...

随机推荐

  1. PAT乙级:1056 组合数的和 (15分)

    PAT乙级:1056 组合数的和 (15分) 给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字.要求所有可能组合出来的 2 位数字的和.例如给定 2.5.8,则 ...

  2. 学习笔记-CCS-MSP430F5529[快速入门篇二]

    由于2021的全国电赛延期了,从今天开始打算好好整理一下使用CCS编程的经验,本篇笔记会好好整理一下我备赛期间用CCS写的程序,包括外部中断,定时器部分的定时中断,定时器输入捕获,PWM波输出,UAR ...

  3. iptables中实现内外网互访,SNAT和DNAT

    目录 一.SNAT原理与应用 二.DNAT原理与应用 DNAT转换:发布内网web服务 DNAT转换:发布时修改目标端口 三.防火墙规则的备份和还原 四.linux抓包 一.SNAT原理与应用 ① S ...

  4. azure bash: kubectl: command not found

    [root@***]# az aks install-cliDownloading client to "/usr/local/bin/kubectl" from "ht ...

  5. 从net到java:java快速入门

    学习java那是不可能的,到为什么不学习一下呢.仅为总结.希望自己在不久的将来能书写优美的java程序.加油!奥利给 1.注释 注释的重要性不言而喻,我们不管写什么代码注释必不可少,那么java的注释 ...

  6. 手动实现instanceof函数

    instanceof 功能 a instanceof b 官方解释为检查构造函数b的prototype 有没有出现在a的原型链上.比如: function A() { } function B() { ...

  7. OpenCV 之 特征匹配

    OpenCV 中有两种特征匹配方法:暴力匹配 (Brute force matching) 和 最近邻匹配 (Nearest Neighbors matching) 它们都继承自 Descriptor ...

  8. netty系列之:使用UDP协议

    目录 简介 UDP协议 String和ByteBuf的转换 构建DatagramPacket 启动客户端和服务器 总结 简介 在之前的系列文章中,我们到了使用netty做聊天服务器,聊天服务器使用的S ...

  9. Use w3m as Web Browser

    Installation: apt-get install w3m. use "a" to input text, "tab" to jump between ...

  10. 快速从SQL语法过度到Elasticsearch的DSL语法

    目录 前言 bool-相当于一个括号 should-相当于or must-相当于and must_not-相当于 ! and term-相当于= terms-相当于in between-相当于rang ...