发表于: 2017-02-09 18:57:44

1 1249


今天完成的事情:

1.听师姐讲萝卜多的原型、

2.完成了PPT原型链和查询原型的方法


明天计划的事:

确认萝卜多需求,代码布置地址,以及写各功能的前端方案。


遇到的问题收获:

1.背景介绍

继承:继承是OO语言(面对对象语言)的一个重要概念,许多OO语言支持两种继承方式:接口继承和实现继承。

接口继承只继承方法签名,而实现继承则继承实际的方法。由于函数没有签名,在ECMAScript中无法实现接口继承,只支持实现继承。

并且其实现继承主要是依靠原型链实现的。--JavaScript高级程序设计


2.知识剖析

2.1原型prototype

JavaScript的每个对象都继承另一个对象,后者称为“原型”(prototype)对象。只有null除外,它没有自己的原型对象。

原型对象上的所有属性和方法,都能被派生对象共享。这就是JavaScript继承机制的基本设计。

通过构造函数生成实例对象时,会自动为实例对象分配原型对象。每一个构造函数都有一个prototype属性,这个属性就是实例对象的原型对象。


总结一下,原型对象的作用,就是定义所有实例对象共享的属性和方法。这也是它被称为原型对象的含义,而实例对象可以视作从原型对象衍生出来的子对象。JS中所有对象都有自己的原型对象

2.2 原型链

对象的属性和方法,有可能是定义在自身,也有可能是定义在它的原型对象。由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。比如,a对象是b对象的原型,b对象是c对象的原型,以此类推。

“原型链”的作用是,读取对象的某个属性时,JavaScript引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。


2.3constructor属性

prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数。

由于constructor属性定义在prototype对象上面,意味着可以被所有实例对象继承。

constructor属性的作用,是分辨原型对象到底属于哪个构造函数。


3.常见问题

访问对象原型的方法有哪些?


4.解决方案

获取实例对象obj的原型对象,有三种方法

1. obj.__proto__

2. obj.constructor.prototype

3. Object.getPrototypeOf(obj)

上面三种方法之中,前两种都不是很可靠。最新的ES6标准规定,__proto__属性只有浏览器才需要部署,其他环境可以不部署。而obj.constructor.prototype在手动改变原型对象时,可能会失效。


5.编码实战

演示链接:https://ptteng.github.io/PPT/demo/js-04-PrototypeChain/demo.html


6.扩展思考

instanceof运算符的原型链原理

instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。

Demo

instanceof运算符的左边是实例对象,右边是构造函数。它的运算实质是检查右边构建函数的原型对象,是否在左边对象的原型链上。

由于instanceof对整个原型链上的对象都有效,因此同一个实例对象,可能会对多个构造函数都返回true。

demo4


7.参考文献

参考一 :阮一峰 http://javascript.ruanyifeng.com/oop/prototype.html


8.更多讨论

从原型对象生成新的实例对象除了new命令外有没有其他方法?



返回列表 返回列表
评论

    分享到