简述原型链是什么,有什么用处?若想访问一个对象的原型,应该使用什么方法?

上海分院:顾配如

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

普通对象与函数对象

JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object ,Function 是JS自带的函数对象

在上面的例子中 o1 o2 o3 为普通对象,f1 f2 f3 为函数对象。怎么区分,其实很简单,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。f1,f2归根结底都是通过 new Function()的方式进行创建的。Function Object 也都是通过 New Function()创建的。

2.知识剖析

原型对象

在 JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预定义的属性。其中函数对象的一个属性就是原型对象 prototype。注:普通对象没有prototype,但有__proto__属性。 原型对象其实就是普通对象(Function.prototype除外,它是函数对象,但它很特殊,他没有prototype属性(前面说道函数对象都有prototype属性))。看下面的例子:

从这句console.log(f1. prototype) //f1 {} 的输出就结果可以看出,f1. prototype就是 f1的一个实例对象。就是在f1创建的时候,创建了一个它的实例对象并赋值给它的prototype,

基本过程如下: var temp = new f1(); f1. prototype = temp; 所以,Function. prototype为什么是函数对象就迎刃而解了,上文提高凡是new Function ()产生的对象都是函数对象,所以temp是函数对象。 var temp = new Function (); Function. prototype = temp;

那原型对象是用来做什么的呢?主要作用是用于继承。举例:

从这个例子可以看出,通过给person.prototype设置了一个函数对象的属性,那有person实例(例中:zjh)出来的普通对象就继承了这个属性。具体是怎么实现的继承,就要讲到下面的原型链了。

原型链

JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype。以上面的例子为例: console.log(zjh.__proto__ === person.prototype) //true 同样,person.prototype对象也有__proto__属性,它指向创建它的函数对象(Object)的prototype console.log(person.prototype.__proto__ === Object.prototype) //true 继续,Object.prototype对象也有__proto__属性,但它比较特殊,为null console.log(Object.prototype.__proto__) //null 我们把这个有__proto__串起来的直到Object.prototype.__proto__为null的链叫做原型链

看图

3.常见问题

1.Object.__proto__ === Function.prototype // true Object是函数对象,是通过new Function()创建,所以Object.__proto__指向Function. prototype。

.Function.__proto__ === Function.prototype // true Function 也是对象函数,也是通过new Function()创建,所以Function.__proto__指向Function. prototype。

4.解决方案

5.编码实战

6.扩展思考

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

7.参考文献

http://zhangjiahao8961.iteye.com/blog/2070650

8.更多讨论

鸣谢

感谢观看

BY——顾配如