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
- 怎么让 a=1&&a=2&&a===3 为 true
https://blog.csdn.net/github_39371177/article/details/95450685
双等号(==):会触发 隐式类型转换 ,所以可以使用 valueOf 或者 toString 来实现。
每次判断都会触发 valueOf 方法,同时让 value+1 ,才能使得下次判断成立。
全等(===):严格等于不会进行 隐式转换 ,这里使用 Object.defineProperty 数据劫持的方法来实现