原型链 & 隐式转换

https://blog.csdn.net/wsymcxy/article/details/81699608

new操作符具体干了什么呢?其实很简单,就干了三件事情。

1 var obj  = {};
2 obj.__proto__ = Base.prototype;
3 Base.call(obj);
 
第一行,我们创建了一个空对象obj
第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象
第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,
      即创建Base函数的执行上下文,其中this指向f返回f

原型和原型链是JS实现继承的一种模型。
原型链的形成是真正是靠__proto__ 而非prototype

其中每个函数对象都有一个prototype 属性
如图所示只有Object 有 prototype,示例出来的 aa 没有prototype ,

但是有aa . _proto === Object.prototype
aa.proto.constructor === Object
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1、原型链

1)构造函数、原型和实例的关系

    ①构造函数都有一个属性prototype,这个属性是一个对象(Object的实例)
    ②原型对象prototype里面有一个constructor属性,该属性指向原型对象所属的构造函数
    ③实例对象都有一个_proto_属性,该属性也指向构造函数的原型对象,它是一个非标准属性,不可以用于编程,它是用于浏览器自己使用的
    
2)prototype与_proto_的关系

    ①prototype是构造函数的属性
    ②_proto_是实例对象的属性

【总结】
        i)函数也是对象,对象不一定是函数;
        ii)对象的本质:无序的键值对集合;键值对当中的值可以是任意数据类型的值
        iii)对象就是一个容器,这个容器当中放的是(属性和方法)

3)属性搜索

  ①在访问对象的某个成员的时候会先在对象中找是否存在
  ②如果当前对象中没有就在构造函数的原型对象中找
  ③如果原型对象中没有找到就到原型对象的原型上找
  ④知道Object的原型对象的原型是null为止
  

原型、实录对象、构造函数之间的关系
在这里插入图片描述
在这里插入图片描述

2、Function

——所有函数都是Function的实例

①本地对象:独立于宿主环境(浏览器)的对象
  ——包括Object、Array、Date、RegExp、Function、Error、Number、String、Boolean

②内置对象——包括Math、Global(window,在js中就是全局变量),使用的时候不需要new

③宿主对象——包括自定义对象、DOM、BOM

如何准确判断一个变量是数组类型
在这里插入图片描述
写一个原型链继承的例子
在这里插入图片描述

  • 所有的引用类型,都具有对象特性,即可自由扩展属性(除了“null”以外)
  • 所有的引用类型,都有一个隐式原型__proto__属性,属性值是一个普通的对象
  • 所有的引用类型,隐式原型__proto__属性值指向它的构造函数的显式原型“prototype”属性值
    当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么它会去它的隐式原型__proto__(也就是它的构造函数的显式原型prototype)中寻找。

为什么有 valueOf / toString 属性呢?

在这里插入图片描述
javascript 中几乎所有类型都具有toString和valueOf属性。几乎所有的类型对象比如Number,String,Boolean,Array,Function,Object,Date,RegExp的原型对象上都有各自的toString或valueOf方法的实现,故它们的实例化的对象自然就继承了这两个方法。
在这里插入图片描述
什么时候会自动调用呢

使用操作符的时候,如果其中一边为对象,则会先调用 toSting 方法,也就是 隐式转换 ,然后再进行操作。二者并存的情况下,在 数值运算中,优先调用了 valueOf , 字符串运算中,优先调用了 toString 。
总结: valueOf 偏向于运算, toString 偏向于显示。

在进行对象转换时,将优先调用 toString 方法,如若没有重写 toString ,将调用 valueOf 方法;如果两个方法都没有重写,则按 Object 的 toString 输出。

在进行 强转字符串类型时,将优先调用 toString 方法,强转为数字时优先调用 valueOf 。

使用运算操作符的情况下, valueOf 的优先级高于 toString

  1. 怎么让 a=1&&a=2&&a===3 为 true
    https://blog.csdn.net/github_39371177/article/details/95450685

双等号(==):会触发 隐式类型转换 ,所以可以使用 valueOf 或者 toString 来实现。
在这里插入图片描述

每次判断都会触发 valueOf 方法,同时让 value+1 ,才能使得下次判断成立。

全等(===):严格等于不会进行 隐式转换 ,这里使用 Object.defineProperty 数据劫持的方法来实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值