方式一:原型链继承特点:实例可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性。(新实例不会继承父类实例的属性!)...Child.prototype = new Parent()const c = new Child();console.log(c) // Child { name: 'zs', age: 20 }方式二:借用构造函数继承特点...:可以向父类构造函数传参 缺点:不能继承父类构造函数的原型function Parent(name) {this.name = name}function Child() {Parent.call(this...'lisi')this.age = 20}const c = new Child();console.log(c) // Child { name: 'lisi', age: 20 }方式三:组合式继承...:原型链继承+构造函数继承function Parent(name) {this.name = name}function Child(name) {Parent.call(this, name)this.age
多态继承中的内存图解如下: 多态中的对象变化的内存图解如下:
给大家分享一个用原生JS编写的拖拽及拖拽方法继承的 小Demo,代码如下。 原生JS...中的拖拽方法继承 #div1 { width: 100px; height: 100px;...function LimitDrag(id) { // 调用父级对象 Drag.call(this, id); }; // 继承父级对象的原型...new Drag('div1'); // div2在拖动过程中通过将方法改写加上边界限制 new LimitDrag('div2
new per.talk = function () { console.log("我是静态方法") } // 调用静态方法 per.talk() // 通过原型链拓展属性和方法 // 原型链上的属性会被多个实例共享...Person.prototype.sex = "男" Person.prototype.work = function () { console.log(this.name + "在工作") } per.work() 类的继承...对象冒充继承 // 对象冒充继承 function Woman() { //对象冒充可以继承函数的属性和方法,无法继承原型链上的 Person.call(this) } var wom...= new Woman() wom.run() //父类函数里的方法 原型链继承 // 原型链继承 function Man() {} // 原型链可以继承函数和原型链上的属性和方法 Man.prototype...= new Person() var man = new Man() man.run() //父类函数里的方法 man.work() //父类原型链里的方法 子类给父类传参 对象冒充+原型链 function
在es6中class可通过关键词extends来实现继承,es5则是修改原型链来实现继承的。...,注意看子类中fn1这个函数,他使用了父类的sky属性,注意在子类使用父类的属性时,只能使用this来调用,使用super是找不到的,因为class中的属性都是实例属性。...es5中的继承 es5中的继承则是让某个构造函数的原型对象等于另一个类型的实例,这样实现的继承。...();//使用父类的方法 相信大家都可以看懂,es5的继承就让子类的prototype等于父类的实例,即可完成继承。...相比之下,es6的继承肯定更清晰,而且更方便,不过es6的继承也是通过原型来操作的,只是给我们封装了。 如无作者授权,请勿转载。
function Student(myName, myAge, myScore) { Person.call(this,myName,myScore);//在子类中通过...student的实例对象--》student的构造函数--》然后是person的实例对象--》 Student.prototype.coustructor指向了student的构造函数。...console.log(this.name, this.age); } } /* 1.在ES6中如何继承...1.1在子类后面添加extends并指定父类的名称 1.2在子类的constructor构造函数中通过super方法借助父类的构造函数 */...// 以下代码的含义: 告诉浏览器将来Student这个类需要继承于Person这个类 class Student extends Person { constructor
Object的属性,并具有obj.x = 1 的属性值 但当参数为null时,obj1则是一个没有原型的新对象,不会继承任何东西,甚至没有初始的toString()方法。...: 可以通过原型继承创建一个新对象 以下函数inherit() 返回一个继承自原型对象p的属性的新对象 function inherit(p){ if(p == null){ // 不能从...== "function"){ //要继承的对象 类型要符合 throw TypeError(); } function f(){ }; //定义一个空的构造函数...f.prototype = p; //原型指向要继承的对象p return new f(); //创建f对象,此对象继承自p } var o = {}; //o 继承Object.prototype...;在JS中,只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关。
如果函数没有返回对象类型 Object(包含 Functoin, Array, Date, RegExg, Error),那么 new表达式中的函数调用会自动返回这个新的对象。...推荐阅读JS继承相关的书籍章节 《JavaScript高级程序设计第3版》第6章——面向对象的程序设计 6种继承的方案,分别是原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承...多重继承法 寄生继承法 构造器借用法 构造器借用与属性拷贝法 《ES6标准入门》第21章——class的继承 《深入理解ES6》第9章——JavaScript中的类 《你不知道的JavaScript》...上卷第6章——行为委托和附录A(ES6中的class) 总结 继承对于JS来说就是父类拥有的方法和属性、静态方法等,子类也要拥有。...子类中可以利用原型链查找,也可以在子类调用父类,或者从父类拷贝一份到子类等方案。 继承方法可以有很多,重点在于必须理解并熟。 悉这些对象、原型以及构造器的工作方式,剩下的就简单了。
类式继承 1.最常用的继承组合模式 —— 借用构造函数 & 设置原型 // 父类 function Parent(name) { this.name = name;...// 设置原型 继承父类this属性以及父类的原型 Child.prototype = new Parent(); 缺点:父构造函数被调用了两次,从而导致同一个属性会被继承两次(this.name...继承了父类自身的属性 继承了父类的原型属性(方法) 基于上面的问题,如果 Child.prototype 不指向 Parent的实例 new Parent(),而是指向 Parent.prototype...原型继承并不涉及到类,这里的对象都是继承自其他对象。...—— 浅复制 & 深复制 继承的目的是为了实现代码复用,所以一个对象要从另一个对象中获取功能,把目标对象的属性和方法复制过来也是一种方法。
在原型式继承的基础上,增强对象,返回构造函数....中extends继承,眼过千遍,不如手写一遍。...第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。...ES6 规定,在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例。...另外,在子类的静态方法中通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类的实例。
考核内容: Class 的继承 题发散度: ★★ 试题难度: ★★ 解题思路: Class 表达式 ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。...需要注意的是,这个类的名字是Person,但是Person只在 Class 的内部可用,指代当前类。在 Class 外部,这个类只能用MyClass引用。...构造函数的prototype属性,在ES6的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。 Object.assign方法可以很方便地一次向类添加多个方法。...类的内部所有定义的方法,都是不可枚举的(non-enumerable) 类的属性名,可以采用表达式。...类的构造函数,不使用new是没法调用的,会报错。 Class不存在变量提升
继承的含义: 继承是面向对象编程中的一个重要概念,通过继承可以使子类的实例使用在父类中定义的属性和方法。...我们可以发现:所有的实例都会公用一个原型链,如果一个实例中修改原型 那么所有实例的值都会被修改。...二、 构造函数继承 针对前面原型链继承可能会存在公用一个原型链的问题,那么我们可以给大家介绍一种方式:构造函数的继承。构造函数的继承相当于将父类复制给子类。...复制的处理,相当于在子类中实现了所有父类的方法,影响子类的性能。...三、 组合继承 原型链继承能继承父类原型链上的属性,但是可能会存在篡改的问题;而构造函数继承不会存在篡改的问题,但是不能继承原型上面的属性。那么我们是否可以将两者进行结合呢?
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的new 到底是干什么的 一、什么是 JS 原型链 我们知道 JS 有对象,比如 var obj =...如果你的函数调用不是 call 形式, 请将其转换为 call 形式 三、JS 的 new 到底是干什么的?...SuperType中的属性复制一份。...无法传递参数 另外,ES5中存在Object.create()的方法,能够代替上面的object方法。...8、ES6类继承extends extends关键字主要用于类声明或者类表达式中,以创建一个类,该类是另一个类的子类。
JS实现继承的方式 构造函数继承 原型继承 组合(构造函数+原型)继承 Class继承 ---- 构造函数继承 构造函数继承的关键:在Child构造函数中执行Parent.call(this)...组合继承 组合继承的关键: 1.属性使用构造函数继承 - 避免了原型继承中Parent引用属性被所有Child实例共享的缺陷。...对于组合继承代码中的Child.Prototype = Object.create(Parent.prototype),还有两种常见的类似写法是Child.prototype = Parent.prototype...调用super函数是为了在子类中获得父类的this,调用之后this指向子类。...因为子类没有自己的this对象,而是继承父类的this对象。如果不调用super函数,子类就得不到this对象。super()作为父类的构造函数,只能出现在子类的constructor()中。
js实现继承 经典继承(原型链) 缺点:过多的继承了没用的属性 Grandfather.prototype.lastName = 'zhang' function Grandfather() {...grandfather的lastName属性,但是由于原型链的关系,造成了son既会继承grandfather自神的东西,grandfather的原型的东西,father自身的东西和father原型上的东西...,造成了不必要的继承 共享原型 本质:重写原型对象 优点:只会继承父的原型,不会继承父原本自带的属性或方法(只有调用new Father()才会继承自身的东西) 缺点:给本身的原型添加属性或方法时,会把继承的那个原型也修改了...) 原理:在函数里面调用函数,约等于将父里面的代码复制粘贴到子里面,然后通过call将父的this改成子的this 缺点: 不能继承借用的构造函数的原型 每次调用子构造函数都要调用多一次借用的父构造函数...) 雏形 本质:重写原型对象 优点:只会继承父的原型,不会继承父原本自带的属性或方法(只有调用new Father()才会继承自身的东西) 缺点:1,这样继承后即使修改了son的原型也不会修改father
console.log("day day up"); } } /* 弊端: 1.由于修改了Person原型对象的constructor...属性, 所以破坏了Person的三角恋关系 2.由于Person和Student的原型对象是同一个, 所以给Student的元素添加方法, Person也会新增方法 *...console.log("run"); } let per = new Person(); per.run(); /* 1.js...中继承的终极方法 1.1在子类的构造函数中通过call借助父类的构造函数 1.2将子类的原型对象修改为父类的实例对象 */ // let
Js继承的实现方式 继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。...方法,在查找name属性的时候首先在自身属性中查找成功所以不再向上查找,若子类没有name成员,则会打印parent console.log(child instanceof Parent); // true...、父类原型属性和方法 不足 无法实现多继承 子类实例化时无法向父类的构造函数传参 所有子类实例都会共享父类的原型对象中的属性 构造函数继承 当子类构造函数被调用时,借助call或者apply调用父类构造方法实现对于...new Child()或直接调用Child() 不足 不支持多继承 实例是父类的实例,不是子类的实例 同样也是将父类的成员与方法做了实例化拷贝 拷贝继承 通过直接将父类的属性拷贝到子类的原型中实现继承...父类新增原型方法与属性,子类都能访问到 不足 不能继承父构造函数的实例对象的成员 所有子类实例都会共享父类的原型对象中的属性 组合继承 组合原型链继承和借用构造函数继承,结合了两种模式的优点,传参和复用
类式继承(构造函数) JS中其实是没有类的概念的,所谓的类也是模拟出来的。特别是当我们是用new 关键字的时候,就使得“类”的概念就越像其他语言中的类了。...它有别于类继承是因为继承不在对象本身,而在对象的原型上(prototype)。每一个对象都有原型,在浏览器中它体现在一个隐藏的__proto__属性上。在一些现代浏览器中你可以更改它们。...原型最后指向的是null。我们说的原型继承,就是将父对像的方法给子类的原型。子类的构造函数中不拥有这些方法和属性。...首先,构造函数继承的方法都会存在父对象之中,每一次实例,都回将funciton保存在内存中,这样的做法毫无以为会带来性能上的问题。其次类式继承是不可变的。...从这里,我们也可以看到类继承和原型基础的一些区别。 结论 原型继承比较符合js这种语言的特点。因为它本身就是js强大的原型的一部分。
补充: js中说一切都是对象,是不完全的,在js中6种数据类型(Undefined,Null,Number,Boolean,String,Object)中,前五种是基本数据类型,是原始值类型,这些值是在底层实现的...都指向了Person.prototype中的showName 这种构造函数模式和原型模式组合使用,基本上可以说是js中面向对象开发的一种默认模式,介绍了以上这几种常用创建对象的方式, 还有其他不常用的模式就不介绍了...,接下来想说的是js中比较重要的继承。...__proto__ === Object.prototype); // true 构造函数模式和原型模式组合继承 只通过原型来实现继承,还存在一定问题,所以js中一般通过借用构造函数和原型组合的方式来实现继承...方法继承,就是上文讲的到的原型链机制继承,另外可以给子构造函数添加自己的属性和方法。 这就是经典继承,避免了但是使用构造函数或者单独使用原型链的缺陷,成为js中最常用的继承方式。
对于使用基于类的语言,如 Java 的开发人员,js 令人困惑,因为它是动态的,并且本身不提供一个 class 实现。...(在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍是基于原型)。 谈到继承时,js 只有一种结构:对象。...每个实例对象( object )都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype )。...该原型对象也有一个自己的原型对象( proto ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。...几乎所有 js 中的对象都是位于原型链顶端的 Object 的实例。 尽管这种原型继承通常被认为是 JavaScript 的弱点之一,但是原型继承模型本身实际上比经典模型更强大。
领取专属 10元无门槛券
手把手带您无忧上云