JS实现继承方式

js中的继承:

Object是所有对象的父级/父类型/超类型,js中所有的对象都直接或间接的继承自Object.

继承有两种方式:接口继承和实现继承,js中只支持实现继承,实现继承主要依赖原型链来完成.

说明 : 其他语言的继承是通过类来实现,js中没有类的概念,js中的继承是某个对象继承另一个对象,是基于对象的继承.

一.JS实现继承方式

     (1)属性拷贝(混入式继承)

     (2)原型式继承

     (3)原型链继承

     (4)借用构造函数继承  经典继承  伪对象继承

     (5)组合继承

     (6)通过特定的方法实现继承

     (7)内容拷贝

1.属性拷贝(混入式继承)

   属性拷贝:

    存在问题: 如果父对象中有引用类型,子对象和父对象的该属性会共享一份数据,修改其                         中一个影响另外一个

     函数拷贝:Object.assign(目标对象,要拷贝属性的对象(多个))------>ES6支持

Object.assign(o,obj1,0bj2)

2.原型式继承(不是严格意义上的继承)

(1)利用构造函数创建出来的对象可以使用原型对象的属性和方法

(2)替换原型

(3)设置子构造函数的原型对象时是父构造函数的原型:student.prototype=person.prototype

    存在问题:1)只能获取父构造函数的原型对象的属性和方法,不能获取实例的属性和方法

                    2)无法修正构造器属性

3.扩展内置对象

Object Array Date Function String Number Boolean

通过这个方式可以扩展内置构造函数,但不建议这样做,在实际开发中很多人开发,项目的代码量非常庞大,如果每个人都通过这个方式扩展对象,可能会出现方法被覆盖等安全问题,不方便项目管理问题

(1)安全的扩展内置对象

    a.提供一个构造函数(自己写的)

     b.设置这个构造函数的原型对象是内置构造函数的一个实例

安全扩展内置对象图解:

3.原型链继承

1)每一对象都是由构造函数创建的

2)每一个构造函数都有自己的原型对象

3)构造函数的原型对象也是一个对象

4)构造函数的原型对象也有自己的构造函数

5)构造函数原型对象的构造函数也有自己的原型对象

6)构造函数原型对象的构造函数的原型对象也是一个对象,也有自己的构造函数

以上就形成了一个人链式结构,这个就称为原型链.

原型链的顶端是Object.prototype

        Object.prototype._proto_=null

A.原型链属性的访问原则:(就近原则)

1).通过对象.属性访问属性的时候,首先会查找自身,如果有直接使用;

2).如果自身没有,会查找该对象的原型对象,如果有直接使用;

3).如果没有,会查找原型对象的原型对象,如果有直接使用;

4).如果没有,就继续之前的操作,向原型链的顶端继续查找

5).直到查找到Object.prototype,如果有就直接使用,如果没有,返回undefined或者报错

B.原型链继承:

1).提供一个父构造函数和子构造函数

2).设置子构造函数的原型对象是父构造函数的实例

Student.prototype=new Person()

C.复杂的原型链示例

动物(毛色,跑) ->人(姓名,useTool)->学生(学号,学习)->男学生(性别男,打游戏)

1).提供4个构造函数

2).设置属性和方法(属性写在构造函数中,方法写在原型上)

3).设置原型链继承

4).修正构造器属性

D.原型链继承注意点:

    1)在完成原型链继承后再修正构造器属性

     2)在完成原型链继承后再设置原型对象的属性和方法

     3)在完成原型链继承后只能通过对象的动态特性添加属性

E.原型链继承存在的问题:

     1)无法传递参数给父构造函数;

      2)继承过来的属性和方法会成为原型属性和方法,存在共享问题

4.Object.create()方法

Object.create会创建一个新的对象,并且设置该对象的原型对象是传入的对象(ES5才支持)

兼容性处理:

方法一

方法二:如果有create方法就直接用,如果没有就自己添加一个方法

函数封装

5.call和apply函数

1).在ES3中,系统给Function的原型添加了2个方法

     Function.prototype.call

     Function.prototype.apply

    作用:借用其他对象的方法

  参数:(1)第一个参数:实际调用方法的对象(函数内部this的绑定对象);

           (2)后面的参数: a:call,参数1,参数2.....     参数列表

                                    b:apply,[参数1,参数2.....]    参数数组

6.借用构造函数继承 经典继承 伪对象继承

1)借用构造函数继承的基本写法,解决了无法传递参数给父构造函数的问题

存在的问题:无法获取原型属性和方法

7.组合继承

1).借用构造函数继承---->只能获取实例属性和方法

2).原型式继承---->获取原型属性和方法


问题:共享同一个原型对象

8.浅拷贝和深拷贝

1)浅拷贝:地址拷贝(指针拷贝),存在数据共享问题

2)深拷贝:内容拷贝(完全拷贝)

      (1)提供一个函数封装深拷贝,有两个参数,第一个是目标参数,第二个参数是要拷贝属性的对象;

      (2)判断第一个参数,如果没有值就自己初始化

      (3)for...in遍历第二个参数

                a.如果是值类型或者是函数,直接赋值

                b.如果不是值类型的数据,就再一次调用这个方法拷贝内部存储的内容

通过深拷贝实现继承

借用构造函数----->获取实例属性

深拷贝------>获取原型属性

Array.isArray(ES5才支持)

作用:判断对象时候是个数组


二.基本包装类型

1.基本包装类型:String  Number  Boolean

1)创建字符串对象

2)创建数值对象

3)创建布尔对象

4)特殊的方式创建

2.基本包装类型注意点

   1)在比较是否相等的时候

基本数据类型怎么会有属性?

 2)内部实现:

字符串 布尔 数值在访问属性或者调用方法的时候

 1).内部会默认创建一个对象

 2).通过这个对象访问属性或调用方法

 3).得到结果后返回结果

 4).销毁该对象

3.Number使用注意

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

推荐阅读更多精彩内容