面向对象OOP-12

2016-09-03-day12 am


面向对象的理解:

面向对象三大特点:
封装:将一个/一类事物的属性和功能集中定义在一个对象中 (为了代码重用!)
继承:父对象中的成员,子对象无需重复创建,即可直接使用。(为了即代码重用,又节约内存)
多态:同一个方法,在不同情况下,表现出不同的状态。(为了体现子对象与父对象之间的差异。)

继承: js中的继承都是通过原型对象实现的,也称之为原型继承/继承原型。

1.原型对象(prototype):

  • 什么是原型对象:集中存储一类对象共有成员的父对象。
  • 何时用原型对象: 只要多个子对象中,拥有相同的成员,就都要集中定义在父对象(原型对象)中一份,然后所有子对象共用!
  • 如何用原型对象:
    1.如何创建: 在创建构造函数时,会自动创建该类型的原型对象prototype
    2.何时继承: new的第二步,设置新对象的__proto__属性继承构造函数的原型对象
    3.如何向原型对象中添加共有成员:类型名.prototype.共有成员名=值

2.原型链: 由各级父对象逐级继承,实现的链式结构。

任何对象都由__proto__继承其父对象

Object.prototype是所有对象的顶级父对象。Object.prototype.__proto__是null
Function.prototype是所有函数对象的父对象。Function.prototype.__proto__是Object.prototype

原型链控制着成员的使用顺序:
优先使用当前对象本地的自有成员
如果自己没有,才延原型链向父级找
如果到Object.prototype没找到,返回undefined。

3.正确的访问对象的成员:

原则: 修改原型链上的共有成员:必须用父对象改。修改自有成员: 必须用当前子对象本身。禁止使用子对象修改共有成员

4.如何判断成员是自有还是共有:

自有: 直接定义在当前对象本地的成员
共有: 对象本地没有,从原型链上继承来的成员。

判断自有:
//判断"成员名"是否直接定义在obj本地
var bool=obj.hasOwnProperty("成员名")  
//如果是自有,就返回true,
//否则返回false
判断共有:

不是自有,且原型链上有

!obj.hasOwnProperty("成员名")&&(obj.成员!==undefined)
//或
"成员名" in obj

注:in: 判断"成员名"是否包含在obj的原型链上。(可检查整个原型链)

5.删除: delete obj.属性名

注:不能用子对象删除共有属性

pm


1.扩展内置对象的API:

  • 为什么: 解决浏览器兼容性问题
  • 何时: 如果想在旧的浏览器上,使用新浏览器的API,就需要再旧浏览器扩展内置对象的API
  • 如何: 都是将自定义的API添加到指定类型的原型对象上。

2.原型API:

2.1获得原型对象:2种:

通过构造函数获得: 构造函数.prototype
通过子对象获得: obj.__proto__ 兼容性
Object.getPrototypeOf(obj)获得obj对象的父对象(原型对象)

2.2判断指定对象是否是子对象的父对象:

father.isPrototypeOf(child),判断father对象,是否是child对象的父对象。
如果father是child的父对象,就返回true,否则返回false
强调: 检查整个原型链

2.3判断指定对象是否是指定构造函数的实例:

child instanceof 构造函数(mather),判断child是不是被构造函数实例化出的
强调: 也检查整个原型链

2.4鄙视题: 判断一个对象是不是数组类型, 有几种办法?

typeof: 只能识别原始类型和函数,无法进一步区分不同的引用类型
1.isPrototypeOf
2.instanceof
3.class属性: 记录了对象创建时的类型名,一旦对象创建,不可更改,只有Object.prototype中的toString方法才能输出class属性
问题: 内置对象的原型对象中都重写了新的toString方法,阻碍了子对象直接调用原始的toString方法
解决: 用call强行调用!要调用方法的完整签名.call(调用方法的对象)
4.Array.isArray(obj),专门用于检测obj是不是数组类型,原理同第三种方法

总结:
call: 用一个对象强行调用一个本来无法调用到的函数。
何时: 希望打破原型链的限制,直接调用一个本不可调用的函数
如何: 要调的函数.call(对象)

添加一个新方法,如何选择加在构造函数上,或者加在原型对象中?
如果希望指定类型的所有子对象都可访问时,就放在原型对象中——必须通过实例化的对象调用(也成为实例方法)
如果无法确定将来调用函数时的对象的类型,就不能放在原型对象中。要放在构造函数上。——static静态方法

3.多态:

重写(override): 如果子对象觉得父对象继承来的成员不好用,就可在本地定义和父对象成员同名的自有成员。优先使用自有成员,而屏蔽了父对象的共有成员。

1. 自定义继承(3种方法):

1). 修改一个对象继承另一个父对象:
child.__proto__=father;
 => Object.setPrototypeOf(
       child,father
    )  
//设置child继承father
2). 批量修改所有子对象的父对象:

时机: 在开始创建子对象之前,就修改原型对象。
构造函数.prototype=father

3). 两种类型间的继承:

问题: 两种类型间,有部分相同的属性结构,和共同的方法。
解决: 抽象出一个公共的父类型
将子类型中相同的部分属性和方法,定义到父类型中。

如何实现两种类型间的继承:

1)). 设置子类型的原型对象继承父类型的原型对象。

 Object.setPrototypeOf(
   子类型的原型对象,
   父类型的原型对象
 );

2)). 借用父类型的构造函数: 父类型构造函数.call(this,参数,...)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,126评论 0 21
  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,107评论 0 6
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 971评论 0 4
  • 我害怕—薛之谦 很多时候我都想拥抱你 哪怕时光之里山南水北 哪怕你我之间人来人往 我依旧要想你 依旧想要抱着你 未...
    南素简阅读 439评论 0 2
  • 原本以为,爱情和婚姻是两回事,可是,自从我喜欢上你,我便认为,爱情,和婚姻并无区别。 所有的等待,相聚,分离,争吵...
    迷人的hero阅读 371评论 4 0