看下面一组代码:
son在查找lastName的时候会逐个往上查找,自己对象空间找不到,沿着自己的proto(__proto__ : Son.prototype--->father),去father中查找,然后再father对象空间中也没有找到lastName,所以再沿着father的proto(__proto__ : Father.prototype---->Grand),去Grand中查找,返回lastName的值
这样把原型上面再加一个原型,再加一个原型,作成链式,访问顺序也是链式,这样的操作就是原型链
那么原型链的终端是什么呢?
首先在上面,我们先看看Grand的原型,即Grand.propotype
发现这里也有一个proto,那么我们现在来看看Grand.propotype.__propo__里面有什么,
发现里面不在有propo了
返回null,说明Object就是终端了
对于原型链上的增删改查,都需要对父级元素做对于的操作,在子元素上操作只会应用到其本身和子孙元素
在看下面:
这种修改是对应用值的修改
son.fortune.card2 其实是对引用值的一种调用,不算是赋值
看下面的题目:
this指向的是,谁调用这个方法,this就指向谁
Object.create(原型) 也可以创建对象,里面填加的是所要创建对象的原型,
里面可以添加对象或者null
发现里面啥都没有
人为的加上proto系统是不会识别的
绝大多数对象最终都会继承自Object.prototype
所以可以理解undefined和null为什么没有toString了,因为他们两个就是原始值,也无法通过包装类变成对象,自然也就没有了toString方法,记得NaN是由toString方法的
这样是不行的,因为后面的点会优先被处理成浮点型数字的点,下面这种方式就可以了
但是这个toString()方法不太一样,首先讲一下num在“.toString()”的时候,会先调用包装类,将其打包成Number对象,
Number的父级有toString方法,但是Number里面又重写了一个名字一模一样但是功能却不同的函数,这就是重写
Object.prototype.toString(原生)
Number.prototype.toString(重写)
Array.prototype.toString(重写)
Boolean.prototype.toString(重写)
String.prototype.toString(重写)
再来看看以前使用的document.write,
\
这说明了document.write在返回的时候会调用toString方法,返回toString之后的值