js实现继承的方法有哪些

JavaScript继承的方法

1、原型链继承

原型链继承是JavaScript中最基本的继承方式,它通过构造函数的prototype属性来实现,每个构造函数都有一个prototype属性,这个属性是一个对象,用于存储构造函数的原型方法和属性,当创建一个新对象时,如果没有显式地调用构造函数,那么JavaScript会自动使用原型链继承的方式来创建新对象。

js实现继承的方法有哪些

function Parent() {}
Parent.prototype.name = 'parent';
function Child() {}
Child.prototype = new Parent();
Child.prototype.constructor = Child;
var child = new Child();
console.log(child.name); // 输出 "parent"

2、构造函数继承

构造函数继承是通过在子类的构造函数中调用父类的构造函数来实现继承,这种方式可以实现代码的复用和模块化,但需要注意的是,如果子类的构造函数没有显式地调用父类的构造函数,那么子类的实例将不会拥有父类的原型链上的属性和方法。

function Parent() {}
Parent.prototype.name = 'parent';
function Child() {
  Parent.call(this); // 调用父类的构造函数
  this.age = 0;
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
var child = new Child();
console.log(child instanceof Parent); // 输出 true
console.log(child.name); // 输出 "parent"

3、组合式继承

js实现继承的方法有哪些

组合式继承是一种更为灵活的继承方式,它允许我们在不破坏原型链的情况下,将父类的方法和属性复制到子类中,这种方式可以通过Object.assign()方法来实现。

function Parent() {
  this.name = 'parent';
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};
function Child() {
  Parent.call(this); // 调用父类的构造函数
  this.age = 0;
}
Object.assign(Child.prototype, Parent.prototype); // 将父类的方法和属性复制到子类中
Child.prototype.constructor = Child;
var child = new Child();
child.sayName(); // 输出 "parent"

4、寄生式继承(ES6)

寄生式继承是一种基于原型链继承的改进方式,它通过Proxy对象来实现,Proxy对象可以在目标对象上定义一些行为,这些行为可以在访问目标对象的属性或方法时触发,寄生式继承的主要优点是可以实现深度克隆,即在复制对象时,不仅复制对象本身,还复制对象引用的所有属性和方法。

js实现继承的方法有哪些

class Parent {}
class Child extends Parent {}
const parentInstance = new Parent();
const childInstance = new Proxy(parentInstance, { // 使用Proxy对象实现寄生式继承
  inherit: true // 只代理从target到handler的属性查找器、描述符查找器、枚举erator、toPrimitive、valueOf、has、defineProperty、getOwnPropertyDescriptor、getOwnPropertyNames、getPrototypeOf、setPrototypeOf、isExtensible、preventExtensions、isSealed、isFrozen、markAsTrusted、delete、getOwnPropertySymbols、enumerate、keys、getOwnPropertyDescriptors以及不可配置的[[Get]]和[[Set]]内部方法的调用者为目标对象,handler返回undefined表示跳过该属性查找器,handler返回非undefined值则表示使用该值替换目标对象中的该属性,handler返回true表示跳过该描述符查找器,handler返回非true值则表示使用该值替换目标对象中的该描述符,handler返回true表示跳过该枚举erator,handler返回非true值则表示使用该值替换目标对象中的该枚举erator,handler返回undefined表示跳过该toPrimitive方法,handler返回非undefined值则表示使用该值替换目标对象中的该toPrimitive方法,handler返回undefined表示跳过该valueOf方法,handler返回非undefined值则表示使用该值替换目标对象中的该valueOf方法,handler返回undefined表示跳过该has方法,handler返回非undefined值则表示使用该值替换目标对象中的该has方法,handler返回undefined表示跳过该defineProperty方法,handler返回非undefined值则表示使用该值替换目标对象中的该defineProperty方法,handler返回undefined表示跳过该getOwnPropertyDescriptor方法,handler返回非undefined值则表示使用该值替换目标对象中的该getOwnPropertyDescriptor方法,handler返回undefined表示跳过该getOwnPropertyNames方法,handler返回非undefined值则表示使用该值替换目标对象中的该getOwnPropertyNames方法,handler返回undefined表示跳过该getPrototypeOf方法,handler返回非undefined值则表示使用该值替换目标对象中的该getPrototypeOf方法,handler返回undefined表示跳过该setPrototypeOf方法,handler返回非undefined值则表示使用该值替换目标对象中的该setPrototypeOf方法,handler返回false表示跳过该isExtensible方法,handler返回非false值则表示使用该值替换目标对象中的该isExtensible方法,handler返回false表示跳过该isSealed方法,handler返回非false值则表示使用该值替换目标对象中的该isSealed方法,handler返回false表示跳过该isFrozen方法,handler返回非false值则表示使用该值替换目标对象中的该isFrozen方法,handler返回undefined表示跳过该markAsTrusted方法,handler返回非undefined值则表示使用该值替换目标对象中的该markAsTrusted方法,handler返回undefined表示跳过该delete操作符调用的目标对象上指定名称的自身属性的操作符结果,handler返回非undefined值则表示使用该值替换目标对象上的指定名称的自身属性的操作符结果,handler返回undefined表示跳过获取指定名称的自有符号属性的操作符的结果,handler返回非undefined值则表示使用该值替换目标对象上的指定名称的自有符号属性的操作符的结果,handler返回undefined表示跳过获取指定名称的自有可枚举属性的操作符的结果,handler返回非undefined值则表示使用该值替换目标对象上的指定名称的自有可枚举属性的操作符的结果,handler返回undefined表示跳过获取指定名称的自有属性描述符的操作符的结果,handler返回非undefined值则表示使用该值替换目标对象上的指定名称的自有属性描述符的操作符的结果,handler为null或未定义时,将删除目标对象上的指定名称的自身属性或指定名称的自有符号属性或指定名称的自有可枚举属性或指定名称的自有属性描述符的操作符结果并将其设置为未定义;否则,将删除目标对象上的指定名称的自身属性或指定名称的自有符号属性或指定名称的自有可枚举属性或指定名称的自有属性描述符的操作符结果并将其设置为给定的新值(如果提供了),如果新值为null或未定义,则删除操作符结果并将其设置为未定义;否则,将删除操作符结果并将其设置为给定的新值(如果提供了),如果新旧值不同且新旧值都是object类型,并且新旧值具有相同的结构,则进行深度克隆以保留原始数据的结构和内容;否则,只进行浅克隆以仅保留原始数据的副本而不保留其结构和内容。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/211000.html

(0)
K-seoK-seoSEO优化员
上一篇 2024年1月11日 06:48
下一篇 2024年1月11日 06:49

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入