蛀牙--《设计模式---通往未来的很高的台阶之(四)》
来源:互联网 发布:儿童毛毯牌子什么知 编辑:程序博客网 时间:2024/04/28 11:54
js中的原型继承
1、所有的数据都是对象
js在设计的时候,模仿了Java引入了两套类型机制:基本类型和对象类型。基本类型包括啥呀???
提问——-???
undefined 、number、Boolean、string、function、object。
按照JavaScript设计者本意,除了undefined之外,一切都应是对象。number boolean string这几种基本类型数据也可以通过“包装类”的方式变成对象类型数据来处理。
事实上,js中的跟对象是Object.prototype对象。他是一个空对象,我们在js中遇到的每个对象,实际上都是从Object.prototype对象克隆来的。Object.prototype对象就是他们的原型。
举个栗子
var obj1 = new Object();var obj2 = {};console.log( Object.getPrototypeOf( obj1 ) === Object.prototype ); //trueconsole.log( Object.getPrototypeOf( obj2 ) === Object.prototype ); //true
2、要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并且克隆他
js和Io是不同的,js的克隆是引擎内部实现的,我们看不到克隆的过程。我们最终得到的就是一个对象
再举个栗子
function Person( name ){ this.name = name;};Person.prototype.getName = function(){ return this.name;}var a = new Person('sven')console.log(a.name); //输出svenconsole.log(a.getName() ); //输出svenconsole.log(Object.getPrototyprOf( a ) === Preson.prototype ); //输出true
我们用new从构造器中得到一个对象。有人说 用了new了 ,这不是类的概念吗?
我们已经一再强调了js中是没有类的概念的,这里的Person并不是类,而是函数构造器,js中的函数既可以作为普通函数被调用,也可作为构造器被调用。当用new运算符来调用函数时,此时函数就是一个构造器
3、对象会记住他的原型
其实并不能说对象有原型,而只能说对象的构造器有原型。对于对象吧请求委托给它自己的原型 这句话,更好的解释就是对象把请求委托给他的构造器的原型,。那么对象如何把请求顺利地装交给他的构造器的原型呢????
js给对象提供了一个名为 _ proto _ 的隐藏属性。某个对象的 _ proto _ 属性默认会指向他的构造器的原型对象。即 {Construcrot}.prototype。 在一些浏览器中,_ proto _ 被公开出来。例如谷歌或者火狐
var a = new Object();console.log(a._proto_ === Object.prototype); ///输出 true
4、如果对象无法响应某个请求,他会把这个请求委托给他的构造器的原型
在js中,每个对象都是从Object.prototype对象克隆来的,如果这样的话,我们只能得到单一的继承关系。即每个对象都继承自Object.prototype。
但是js在设计时,对象最初是Object.prototype对象克隆来的,但对此昂构造器的原型并不仅仅限于Object.prototype上。而是可以动态指向其他对象。这样一来,当对象a需要借用b的能力时。就可以选择性的吧对象a的构造器的原型指向对象b,从而达到继承的效果。
var obj = {name:'sven'};var A = function(){};A.prototype = obj;var a = new A();console.log( a.name ); //输出:sven
以上就是最常用的原型继承方式
当我们希望得到一个类继承自另一个类时该如何操作
var A = function(){};A.prototype = { name:'sven' };var B = function(){};B.prototype = new A();var b = new B();console.log( b.name ); //输出 seven
以上代码的流程解释::
首先,尝试遍历对象b中所有的属性,没有找到name这个属性,接着查找name的请求被委托给对象b的构造器的原型。他被b._ proto _记录着并且指向B.prototype。而B.prototype被设置为一个通过new A()创建出来的对象。于是请求被委托给这个对象那个的构造器原型A.prototype。在这里找到了name属性,并打印出他的值。。
===============过程很重要=================
提问 —–原型链是无限长的吗 欢迎评论解答
自此以上 设计模式中的 ———原型模式就介绍完了。原型模式是一种设计模式,也是一种编程泛型,它构成了js这门语言的根本。原型模式十分重要,和JavaScript开发者密切相关。。
人之所以弱小是因为还有缺陷 ——《蛀牙》
- 蛀牙--《设计模式---通往未来的很高的台阶之(四)》
- 蛀牙--《设计模式---通往未来的很高的台阶之(一)》
- 蛀牙--《设计模式---通往未来的很高的台阶之(二)》
- 蛀牙--《设计模式---通往未来的很高的台阶之(三)》
- 蛀牙--《设计模式---通往未来的很高的台阶之(五)》
- 蛀牙--《设计模式---通往未来的很高的台阶之(六)》
- 通往幸福的九级台阶
- [软件人生]苦难与蜕变——心性修炼是通往高手之路的第一个台阶[ZT]
- 转载:苦难与蜕变——心性修炼是通往高手之路的第一个台阶
- 代码脏乱的“蛀牙”效应
- luoguP1462 通往奥格瑞玛的道路[四星]
- 转:IT恐怖战国:通往终极垄断的最后几级台阶
- 阅读笔记常见的设计模式之四:工厂模式
- 高品质的网页设计与技巧之四(元素的组织)
- 我们的目标是:没有蛀牙!
- 拔掉那颗蛀牙的红警
- 读前辈的大话设计模式(四)之装饰模式,抒自己的读后感
- 通往理想之路的书单
- fabric.js通过json字符串生成object
- Android Fragment 真正的完全解析(下)
- 使用eclipse 构建多模块 maven 项目
- SuperMap iObjects for Java组件写iServer扩展服务
- 零和博弈-极大极小搜索&Alpha-Beta剪枝(井字游戏)
- 蛀牙--《设计模式---通往未来的很高的台阶之(四)》
- tiny210 uboot sd卡启动
- nginx.conf 配置(如何配置 php)
- FFMPEG学习【libavcodec】:音频重采样
- Android Fragment 你应该知道的一切
- 听唐僧谈用人之道
- hibernate简介及原理
- bzoj 3560 DZY Loves Math V
- opencv StereoBM各个参数的意义