原型链的图示及代码演示

1.class

constructor

属性

方法


// 类

class Student {

    // 构造函数

    constructor(name, number) { // 属性

        this.name = name

        this.number = number

    }

    // 方法

    sayHi() {

        console.log(`姓名 ${this.name} 学号 ${this.number}`)

    }

}

// 实例

const xialuo = new Student('夏洛', 100)

console.log(xialuo.name, xialuo.number)

xialuo.sayHi()

// 实例

const madongmei = new Student('马冬梅', 101)

console.log(madongmei.name, madongmei.number)

madongmei.sayHi()

    // ---------------------

    // 夏洛 100

    // 姓名 夏洛 学号 100

    // 马冬梅 101

    // 姓名 马冬梅 学号 101


2.继承

extends

super


// 父类

class People {

    constructor(name) {

        this.name = name

    }

    eat(something) {

        console.log(`${this.name} eat ${something}`)

    }

}

// 子类

class Student extends People {

    constructor(name, number) {

        super(name)

        this.number = number

    }

    sayHi() {

        console.log(`学生 ${this.name} 学号 ${this.number} 打招呼~`)

    }

}

// 子类

class Teacher extends People {

    constructor(name, major) {

        super(name)

        this.major = major

    }

    teach() {

        console.log(`${this.name} 教授 ${this.major}`)

    }

}

// 实例:学生

const xialuo = new Student('夏洛', 100)

console.log(xialuo.name, xialuo.number)

xialuo.sayHi()

xialuo.eat('蛋糕')

// 实例:老师

const wanglaoshi = new Teacher('王老师', '语文')

console.log(wanglaoshi.name, wanglaoshi.major)

wanglaoshi.teach()

wanglaoshi.eat('茄子')

    // ---------------------

    // 夏洛 100

    // 学生 夏洛 学号 100 打招呼~

    // 夏洛 eat 蛋糕

    // 王老师 语文

    // 王老师 教授 语文

    // 王老师 eat 茄子


3.类型判断-instanceof

instanceof 可以判断引用类型

Object 是所有类 class 的父类

Student 继承于 People , People 继承于 Object


console.log(xialuo instanceof Student)

console.log(xialuo instanceof People)

console.log(xialuo instanceof Object)

console.log([] instanceof Array)

console.log([] instanceof Object)

console.log({}

    instanceof Object)


4.原型

4.1 class 实际上是函数,可见是语法糖


console.log(typeof Student)

console.log(typeof People)

    // 解释:

    // js的 class 继承不像 java 纯继承,而是原型继承

    // class 本质还是一个 function

console.log(typeof Object)

console.log(typeof Array)


4.2 隐式原型和显示原型


console.log(xialuo.__proto__)

console.log(Student.prototype)

console.log(xialuo.__proto__ === Student.prototype) // true

xialuo.name

"夏洛"

xialuo.number

100

xialuo.sayHi()

学生 夏洛 学号 100 打招呼~

undefined

xialuo.__proto__

People {constructor: ƒ, sayHi: ƒ}

xialuo.__proto__.sayHi()

学生 undefined 学号 undefined 打招呼~

undefined

xialuo.__proto__.name

undefined

xialuo.__proto__.number

undefined

xialuo.__proto__ === Student.prototype

true


5.原型图

原型模型图

6.原型关系

每个 class 都有显示原型 prototype

每个实例都有隐式原型 __proto__

实例的 __proto__ 指向对应 class 的 prototype


7.基于原型的执行规则

获取属性 xialuo.name 或执行方法 xialuo.sayHi() 时

先在自身属性和方法寻找

如果找不到则自动去 __proto__ 中查找


8.原型链


console.log(People.prototype === Student.prototype.__proto__)


9.原型链图

原型链模型图

10.向上找

class 里调用属性调用方法的本质,以及继承的本质包括如何继承于 Object 的本质。


11.instanceof 

顺着隐式原型向上找,对应到 class 的显示原型。


12.JS原型本章相关的面试题

题目解答

• 如何准确判断一个变量是不是数组?


console.log(a instanceof Array)


• class的原型本质,怎么理解?

答:

原型和原型链的图示(不参考任何自己画下来)

属性和方法的执行规则(如何通过链向上找,也很重要)

• 手写一个简易的jQuery,考虑插件和扩展性


class jQuery {

    constructor(selector) {

        const result = document.querySelectorAll(selector)

        const length = result.length

        for (let i = 0; i < length; i++) {

            this[i] = result[i]

        }

        this.length = length

        this.selector

    }

    get(index) {

        return this[index]

    }

    each(fn) {

        for (let i = 0; i < this.length; i++) {

            const elem = this[i]

            fn(elem)

        }

    }

    on(type, fn) {

            return this.each(elem => {

                elem.addEventListener(type, fn, false)

            })

        }

        // 扩展很多 DOM API

}

// 插件

jQuery.prototype.dialog = function(info) {

    alert(info)

}

// 覆写“造轮子”

class myJQuery extends jQuery {

    constructor(selector) {

            super(selector)

        }

        // 扩展自己的方法

    addClass(className) {

    }

    style(data) {

    }

}


13.myjquery原型链模型图

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

推荐阅读更多精彩内容