JS - 原型进阶

上篇文章中说了原型基础,这张文章说说原型进阶知识,此篇文章着重讲原型继承。此处需要引入Java中一个知识点:对象,要记住万物皆对象

先出代码:
JS - 原型进阶
从浏览器控制台两个打印语句都是Object {},可见构造函数Person的原型是Object,实例对象p的原型是Object。
JS - 原型进阶从监视器也可以看到,构造函数的prototype属性值是Object,实例对象的__proto__属性值是Object;且实例对象可以使用原型中的属性、方法等
JS - 原型进阶如图,实例对象p可以调用其原型中的getName()方法,打印结果Kaven。
可说对象p是继承自Object。即对象继承自其原型

从上图中引出一个新知识:原型链
根据上图可看出对象p的原型链:p-->Person.prototype-->Object.prototype-->null。这个就是原型链默认的结构
此处需要记住一个东西:Object.prototype的原型为null。

当然我们也可以对原型链进行修改,例如:
(1)将Carr.prototype重新赋值为一个构造函数
JS - 原型进阶
此时的原型链:c-->Person-->Function.prototype-->Object.prototype-->null
(2)将Carr.prototype重新赋值为一个构造函数的原型
JS - 原型进阶
此时的原型链:c-->Person.prototype-->Object.prototype-->null
(3)将Carr.prototype重新赋值为一个对象:
JS - 原型进阶
此时的原型链:c-->Person-->Person.prototype-->Object.prototype-->null

最后引出一个难点:Function
概念:所有函数都是Function的实例对象;Function是自己的实例对象;Function在JS中是一等公民
用途:Function一般用来动态创建方法,例如请求的数据返回时,功能与eval差不多,但是比eval更安全
使用方法:
JS - 原型进阶
例中,第一个字符串作为参数,第二个字符串作为方法主体
知识点:在用Function动态创建方法时,最后一个参数作为方法主体,其他参数作为方法的参数

引入Function之后,举一个例子:
JS - 原型进阶
以这个图为例,我画一下这个图的原型三角
JS - 原型进阶

原型进阶总结:
(1)JS中的继承是原型的继承
(2)万物皆对象,Object是所有对象的祖先
(2)Object.prototype有原型(对象),但为null
(3)对象可以使用原型链中其父亲及以上的成员
(4)Function是自己的实例,所有的函数都是Function的实例