function New(f){return function(){var o = {'__proto__': f.prototype};f.apply(o, arguments);return o;}
}
function Person(name, age){this.name = name;this.age = age;
}
var p = New(Person)('xl', 24);

在一段javascript基础学习视频中,老师大胆想象了一下new方法创造实例对象的原理。

其中一个关键点,让对象的__proto__属性指向任何一个构造函数:{'__proto__': f.prototype}

这个我就蛮好奇的,直接这样,然后以下两段都成立了。

p instanceof Person   // true
p.constructor === Person  // true

以上说明,这个隐藏的属性__proto__的指向一旦建立,那么p实例的constructor就自动指向了Person构造器(此理解是错的)。

2018-05-03:今天继续了解原型链时,发现我这里理解错了。其实p实例没有生成指向Person构造器的constructor属性,因为测试发现p.hasOwnProperty('constructor')结果是false。发现p.constructor有值,并指向Person,是因为p在自己上面找不到constructor时,沿着原型找到了Person原型的constructor属性,所以下图才是对的。

但是我还是好奇为什么。

之前我一直以为instanceof 是否成立还和constructor有关系。

而实际上是,{'__proto__': f.prototype}这个直接的导致了constructor关系(上图绿线)的建立。当我试图把constructor的两个关系重新指向时,

p.constructor = {other: 1};
Person.prototype.constructor = {other: 2};p instanceof Person // true

p仍然是Person的实例,所以instanceof和constructor无关。而当我试图改变Person的prototype的指向之后,终于变了

Person.prototype = {other: 3}p instanceof Person   // false

另外我尝试了一下,在改变Person.prototype指向之前,让其他任何函数的prototype都指向Person.prototype,则

function Person2(){}
Person2.prototype = Person.prototypep instanceof Person  // true
p instanceof Person2  // true

p可以是多个构造函数的实例。

试验之后的结论是:

instanceof 与constructor属性无必然关系,只要对象的隐藏属性__proto__指向任何构造器的prototype属性,那么对象都会是该构造器的实例;对象也可以是多个构造器的实例。

修改:

结论改为

instanceof 与constructor属性无必然关系,只要对象的隐藏属性__proto__,或者对象的__proto__的__proto__,或者对象的__proto__的__proto__的__proto__..........指向任何构造器的prototype属性,那么对象都会是该构造器的实例;对象也可以是多个构造器的实例。

转载于:https://www.cnblogs.com/molinglan/p/8473214.html

夯实JavaScript基础之prototype, __proto__, instanceof相关推荐

  1. 面试:JavaScript基础概念

    文章目录 1. JS基础概念 JavaScript 常见知识总结 重点 1.js的基本数据类型都有哪些 2.判断基本数据类型的方法 typeof instanceof Object.prototype ...

  2. JavaScript基础之基础

    JavaScript基础 JavaScript简介 一个完整的JavaScript实现应该由以下三个部分构成: ECMAScript 标准 DOM 文档对象模型 BOM 浏览器对象模型 JS也是一种面 ...

  3. VN-SGG JavaScript 基础(中)

    [VN-SGG] JavaScript 基础(中) JavaScript视频课程笔记[入门到精通],这只是笔记!!! 主要内容: this,对象,原型对象,垃圾回收,数组: call.apply,ar ...

  4. JavaScript 基础知识点

    JavaScript (JS) 是一种编程语言,为通常用于客户端(client-side)的网页动态脚本,不过,也常通过像Node.js这样的包,用于 服务器端(server-side). 今天,发一 ...

  5. 【JS】1037- 面试前必备的 JavaScript 基础知识梳理总结

    1. JavaScript简介 JavaScript 最开始是专门为浏览器设计的一门语言,但是现在也被用于很多其他的环境. 如今,JavaScript 已经成为了与 HTML/CSS 完全集成的,使用 ...

  6. 2020-web前端-JavaScript基础笔记

    ==================================================================================================== ...

  7. 前端小白学习路线及知识点汇总(三)-- JavaScript基础

    前端小白学习路线及知识点汇总(三)-- JavaScript基础 一. JavaScript的组成 ECMAScript:由ECMA国际进行标准化的一门编程语言,往往被称为JavaScript或Jsc ...

  8. 前端工程师自检清单(JavaScript基础)

    知识体系来源于一名[合格]前端工程师的自检清单 winter在他的<重学前端>课程中提到: 到现在为止,前端工程师已经成为研发体系中的重要岗位之一.可是,与此相对的是,我发现极少或者几乎没 ...

  9. 前端面试知识点总结JavaScript基础之原型和原型链(二)

    一.JavaScript基础 原型和原型链 1.理解原型设计模式以及JavaScript中的原型规则 设计模式 1.工厂模式:在函数内建立一个对象,给对象赋予属性及方法再将对象返回设计模式. func ...

最新文章

  1. AIX 修 炼 之 路
  2. 记一次php手工注入(mysql)
  3. 常规流之块级格式化上下文(Block Formatting Contexts)
  4. lombok null字段不显示 继承_Lombok 要知道的 8 个点
  5. android 支付模块封装,Android集成支付----支付宝支付总结与封装
  6. android q全局夜间模式,安卓Q新功能全局夜间模式,网友:都9102年了,魅族Flyme早就有...
  7. scikit-learn——快速入门 - daniel-D(转)
  8. mysql strict_mysql 严格模式 Strict Mode说明(转)
  9. 极简代码(一) —— class label 的统计计数
  10. bzoj 3824: [Usaco2014 Dec]Guard Mark【状压dp】
  11. python 拟合分布_如何使用python将weibull分布拟合到数据?
  12. Computing the cost J(θ)----吴恩达机器学习作业
  13. html模拟终端,超级终端连续ping
  14. 计算机多媒体技术的主要特征是什么,计算机多媒体技术主要特征
  15. 【题解】洛谷 P1957 口算练习题
  16. 复习————吃饭睡觉打豆豆
  17. 2021年4月7日 关于三层交换机的配置及命令!!!
  18. 6.lambda表达式
  19. html如何添加时钟效果,HTML5实现时钟效果
  20. 微信小程序仿网易云音乐(使用云开发,提供源码)

热门文章

  1. IOS工作笔记(五)
  2. 使用MyEclipse创建可执行jar
  3. 一步一步SharePoint 2007系列文章目录
  4. CLR中的IL、CTS和CLS总结
  5. oracle如何升序,oracle排序操作
  6. java 文件分隔符_Java文件分隔符
  7. linux 查看主板sn_如何使用您的工业边缘计算单元:第三章:使用你的JayBox 主板...
  8. 很旧的航海手游java,10年经典!《黎明之海》手游开启航海回忆
  9. oracle创建序列seq起始值为1_oracle 重置序列从指定数字开始的方法详解
  10. apk可以解压再复制到手机吗_不行了,这个打通手机和电脑的神器,必须得安利给你们...