You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
classPerson{constructor(name){this.name=name;}sayHi(){console.log(`my name is ${this.name}`);}}classManextendsPerson{constructor(name,age){super(name);this.age=age;}sayAge(){console.log(`I am ${this.name}, I am ${this.age} years old`);}}letp_man=newMan('tom',19);p_man.sayAge();// I am tom, I am 19 years oldp_man.sayHi();// my name is tom
encountermm, leopardzhang, xddudu0101 and YGHygh111
class Apple extends Fruits{
constructor(level, name, size='small') {
super(name, size)
this.level = level
}
}
var apple = new Apple(1, 'apple')
apple.sayName()
console.log(apple)
functionSuper(){this.property=truethis.frend=['Bob','Tom']}Super.prototype.say=function(){console.log('hello')}functionSub(){Super.call(this)this.subProperty=true}functionobject(prototype){functionF(){}F.prototype=prototypereturnnewF()}// Sub.prototype = new Super()Sub.prototype=object(Sub.prototype)Sub.prototype.construtor=SubSub.prototype.speak=function(){console.log('hi')}
Activity
ghost commentedon Jul 8, 2019
JavaScript 使用基于原型链的继承。访问一个对象的属性时若该属性在对象上不存在,则会沿原型链向下搜寻每个原型对象。
每个构造器都拥有 prototype 属性,代表该构造器的原型对象,初始为一个 Object 实例。所有用此构造器 new 出的对象都可以访问该对象的属性。
如果一个构造器 A 的 prototype 属性是另一个构造器 B 的实例,那么 B 的原型链会被接到 A 上,此时我们就说 A 继承了 B,A 实例可以访问所有 B 原型链上的属性。
nowherebutup commentedon Jul 8, 2019
js常采用寄生组合式继承,每个对象特有的属性在构造函数重新创建,每个对象共用的属性方法写在原型对象上,利用每个对象的_proto_属性沿着原型链往原型找与键对应的属性,找到则返回对应的属性;
ES6中增加class语法糖,本质上没什么区别,但是统一了ES6之前五花八门的继承写法
AnsonZnl commentedon Jul 8, 2019
JavaScript 基于原型链实现的继承,简单来说就是通过对象的
__proto__
实现的向上查找。比如你从未定义过
toSing()
方法,但是你却可以在任何地方使用它,原因就是当你使用xx.toString()
时,他会先在自身查找看看没有这个方法,如果没有就根据__proto__
寻找他的原型对象,看看他的原型对象上有没有....知道找到为止。如何证明呢,做个试验:
可以肯定的是,新创建的
arr
上没有定义toString()
方法,我们知道数组的构造函数是Array()
,可以重写一下toSing()
方法:MrZse commentedon Jul 9, 2019
JS实现继承的方式有以下几种:
1.通过构造函数实现继承:
通过这种方式,只能继承定义在父类构造函数内的属性与方法,定义在prototype原型对象内的属性与方法则无法继承,因此对其改进。
2.通过原型对象进行继承:
通过这种方式,则既能继承构造函数内的属性与方法,也能继承原型链上的属性与方法。但是,由于令其原型对象指向父类的一个实例对象,使得所有子类的实例对象所访问到的属性指向同一个对象,所以会出现改变一个子类实例对象的父类中的属性,另一个子类对象的属性也跟着改变。因此我们有下一个方法来改进:
3.组合方法进行继承:
但是这种方法,使得父类的构造函数执行了两次,为了减少父类的构造函数的不必要的多次执行,如下修改代码。
4.组合方法进行继承优化:
这样解决了前面提到的问题,但是这样简单粗暴的继承,使子类的原型对象指向了父类的原型对象,会导致当子类实例对象通过constructor属性获取其构造函数时,获得的是父类的构造函数(因为constructor属性在prototype属性中被继承),因此再进行优化:
5.组合方法进行继承优化2:
由于Object.create()这个api的特性,父类的原型对象会继承在子类的原型对象的原型对象上,实现了子类原型对象与父类原型对象的隔离,这时再给子类的原型对象的constructor属性赋值。为什么直接在第四种方式的后面直接赋值呢?因为这是子类与父类的原型对象指向同一个对象,修改属性会同时修改子类与父类的原型对象。
这样5种实现继承的方法各自的优缺点都明了了。
imccode commentedon Jul 9, 2019
组合继承
xjt31012 commentedon Jul 9, 2019
使用es6里的class和extends继承
class childFunction extends parentFunction{}
songlovena commentedon Jan 25, 2021
@ ES5继承
es5的继承是根据
原型链
继承的;@ ES6继承
es6的class其实只是一种语法糖;定义一个class类,使用
typeof
判断类型,输出function
;因为在es6之前是没有类的概念的,只有构造函数创建实例对象。但是其他面向对象语言是有类的概念。因此在es6就新增可使用关键字class
来定义类,这种写法只是让对象原型的写法更加清晰、更像面向对象编程的语法。在class中使用extends、super
两个关键字来实现继承。smile-2008 commentedon Feb 23, 2021
xiaoqiangz commentedon Jun 22, 2022
// 构造函数继承
function Person(name, age) {
this.name = name
this.age = age
this.sayName = function() {
console.log(this.name)
}
}
function SubPerson(name, age){
Person.call(this, name, age)
}
var p1 = new SubPerson('xx', 11)
console.log(p1)
p1.sayName()
// 原型链继承
function Car(){
}
Car.prototype.name = 'byd'
Car.prototype.type = '电动车'
Car.prototype.sayName = function() {
console.log(this.name)
}
function SubCar(name) {
this.name = name
}
SubCar.prototype = new Car()
var c1 = new SubCar('bmw')
console.log(c1)
c1.sayName()
// 组合继承
function Person(name, age) {
this.name = name
this.age = age
this.sayName = function() {
console.log(this.name)
}
}
function SubPerson(name, age){
Person.call(this, name, age)
}
SubPerson.prototype = new Person()
SubPerson.prototype.constructor = SubPerson
// 原型继承 类似Object.create()对对象的浅拷贝
function createObject(o) {
function f() {}
f.prototype = o
return new f()
}
// es6 extend
class Fruits{
constructor(name, size){
this.name = name
this.size = size || 'big'
}
sayName() {
console.log(this.name)
}
}
class Apple extends Fruits{
constructor(level, name, size='small') {
super(name, size)
this.level = level
}
}
var apple = new Apple(1, 'apple')
apple.sayName()
console.log(apple)
panpanxuebing commentedon Dec 16, 2024