this更像是一个函数的参数,如果我们以这句话为标准的话,很容易就能模拟出this的行为

因为所有的函数的this都为函数的一个参数,所以其值除了被bind指定了的情况外,以调用方式密切相关,让我们暂时忽略原型链相关内容,用以上标准把代码改写成var father = function (_this, age) {

_this.age = age;

_this.say = function (_this) {

console.log(

"hello i am " + _this.name + " and i am " + _this.age + "years old"

);

};

};

var child = function (_this, age, name) {

_this.name = name;

father(_this, age);

};

const man = {};

child(man, 28, "bill");

man.say(man);

由于this是作为参数传入的那么apply,call方法也就没了用武之地,那么我们来看看bind在这个标准下的表现是怎样的,我们可以轻松的实现bindvar print = (_this) => {

console.log(_this.name + " " + _this.age);

};

/**

*

* @param {*} _bind_func_this bind的函数的this对象,没用用到

* @param {*} func 要绑定this的函数

* @param {*} _this 要和该函数绑定的this

*/

var bind = function (_bind_func_this, func, _this) {

return function (__this, ...args) {

return func(_this, ...args);

};

};

const man1 = { name: "666", age: 666 };

var bindedPrint = bind(null, print, man1);

//绑定死this后,给bindedPrint赋值了一个新的this也是无效的

bindedPrint({ name: "777", age: 777 });

虽然代码很蹩脚,但是确实是在一定程度上模拟出了this的效果,而且还能更好的理解javascript中this的各种表现,假设有以下代码(在非严格模式下执行否则会报错),在javascript中就好像是把this当作了一个参数并根据具当前的调用对象自动传入this,bind了this的除外var obj = {

name: "obj_name",

print() {

console.log(this.name);

}

};

var name = "window_name";

var obj2 = {

name: "obj2_name"

};

var print = obj.print;

obj2.print = obj.print;

//相当于 obj.print(obj)

obj.print();

//相当于 obj2.pring(obj2)

obj2.print();

//等价于window.print也就是print(window)

print();

在javascript中可能很难体会到这一点让我们看看c++ primer里面是怎么说的

在面向对象语言里面说this可能还是不太有说服力,让我们看看用c语言怎么模拟出面向对象的效果,是不是感觉似曾相识,几乎和我们模拟this的javascript代码差不多#include

//C 语言没有类,但可以用结构体充当一个类

//与类不同,结构体只能定义变量,不能够定义函数,可以通过函数指针的方法来实现其功能

//定义“类 ”的成员变量以及方法

typedef struct Person{

char name;

int age;

void (*EatFunction)(struct Person this, int num);

}Person;

//定义函数功能

void EatFunction(struct Person this, int num){

printf("Test\n");

}

//定义“类 ”的构造函数

//与面向对象不同,C语言的“类”的 构造函数不能放在“类”中,只能放在“类”外

//构造函数主要完成 变量的初始化,以及函数指针的赋值

Person *NewPerson(Person *this){

this->name = 'A';

this->age = 18;

this->EatFunction = EatFunction;

}

//主函数调用

int main(){

Person person;

NewPerson(&person);

person.EatFunction(person,0);

return 0;

}

结论:你的问题其实和用c语言怎么实现面向对象这个问题是重合的,this对象更像是一个函数的隐式参数,该值为在调用该函数时由请求该函数调用的对象,

c语言this什么意思,JavaScript 中的this是什么?它到底做了什么?相关推荐

  1. Javascript中的循环变量声明,到底应该放在哪儿?

    不放走任何一个细节.相信很多Javascript开发者都在声明循环变量时犹 豫过var i到底应该放在哪里:放在不同的位置会对程序的运行产生怎样的影响?哪一种方式符合Javascript的语言规范?哪 ...

  2. .bat是什么语言_简单说说当我们打开网页时,浏览器到底做了什么?

    前言:为什么我们需要掌握浏览器的原理 作为一名前端研发,平日里打交道最多的,就是各式各样的客户端. 不论你是针对pc端还是移动端,甚至是专门在微信端做前端研发,都需要跟一样东西接触--浏览器. 不知道 ...

  3. 如何理解并学习javascript中的面向对象(OOP)

    本文不适合javascript初学者看(javascript水平还停留在函数级别的朋友,看了会觉得很晕的).如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的 ...

  4. JavaScript中的数据类型判断

    typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型. 语法 typeof 运算符后接操作数: typeof operand typeof(operand) 参数 operan ...

  5. name optimize is not defined 怎么解决_Web前端:怎么在JavaScript中比较对象?

    大家好,我来了,本期为大家带来的前端开发知识是"Web前端:怎么在JavaScript中比较对象?",有兴趣做前端的朋友,一起来看看吧! 比较JavaScript中的原始值很简单. ...

  6. html语言中 加当前时间,javascript中怎么获取当前时间?

    在web开发中,通过js获取时间非常的常用.下面本篇文章就来给大家介绍一下使用javascript获取当前时间的方法,希望对大家有所帮助. 在javascript中可以使用Date对象中的Date() ...

  7. 1507四舍五入c语言,JavaScript中用于四舍五入的Math.round()方法讲解

    此方法返回一个数四舍五入为最接近的整数的值. 语法 Math.round( x ) ; 下面是参数的详细信息: x: 一个数字 返回值: 返回数字四舍五入为最接近的整数的值. 例子: JavaScri ...

  8. index.html是什么语言,JavaScript中index是什么意思?

    index是JavaScript中Option 对象的一个属性,该属性可返回下拉列表中选项的索引位置.下面本篇文章就来给大家介绍一下index属性,希望对大家有所帮助. index 属性可返回下拉列表 ...

  9. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  10. JavaScript 中的有限状态机

    http://www.ibm.com/developerworks/cn/web/wa-finitemach/ JavaScript 中的有限状态机 Page navigation 系列文章 有限状态 ...

最新文章

  1. signature=65a5d6b0ac441e09ae68e9bbee76cba1,Bortezomib
  2. 计算机之间是如何实现通信的?—Vecloud微云
  3. 1.2开发文档简读,了解全貌.mp4
  4. jdk1.8对synchronized锁的优化
  5. 计算机网络对口题目,2011-2015计算机对口升学网络试题汇总.doc
  6. html5支持多线程,html5 多线程
  7. java简单的文本编辑器_采用java语言如何建立一个简单的文本编辑器
  8. linux初始:命令行解释器(shell)、权限
  9. 云存储软件行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. 连接mysql超过连接次数处理办法
  11. Go 系列教程 —— 26. 结构体取代类
  12. canvas-画图改进版
  13. 十大骨传导耳机品牌,骨传导耳机品牌推荐
  14. 《网络流量分类》部分插图
  15. 源码阅读分析 - Window底层原理与系统架构
  16. python+django大学教室自习室预约管理系统
  17. 开发制作一个小程序需要多少钱
  18. hadoop+Spark实战基于大数据技术之电视收视率企业项目实战
  19. 乐优商城遇到的坑一步一步总结
  20. Ruff 公开课回顾——物联网应用已经落地,区块链技术紧随其后

热门文章

  1. Windows 安装PHP SG11插件
  2. 大数据杀熟 算法_大数据“杀熟” 怎能让真正的刀俎逍遥法外
  3. 领克无线carplay适配方案展示
  4. Laravel文档阅读笔记-mews/captcha的使用(验证码功能)
  5. 品质催生消费升级 ACCESS集团和VTN国际品牌会员俱乐部的跨境电商之路
  6. 【论文学习】Abnormal behavior recognition for intelligent video surveillance systems: A review
  7. 教你如何用python把玩守望先锋新英雄
  8. 英语知识点整理day02
  9. 如何将腾讯视频QLV格式转换成MP4
  10. C++获取成员变量的偏移地址