发表于: 2017-02-09 18:57:44
1 1248
今天完成的事情:
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命令外有没有其他方法?
评论