【js】获取对象的所有属性和方法,包括继承属性

文章探讨了JavaScript中的原型链机制,解释了实例对象如何通过__proto__指向原型对象,以及构造函数的prototype属性。通过示例展示了类的继承(extends关键字)以及super关键字的使用。还提到了ES6类定义对原型对象和实例对象的处理,并介绍了Object.getOwnPropertyNames方法用于获取对象的所有自身属性。
摘要由CSDN通过智能技术生成

原型链图:
在这里插入图片描述

  • 实例就是对象,实例的__protpo__指向的是原型对象。

  • 实例的构造函数的prototype也是指向的原型对象。

  • 原型对象的construor指向的是构造函数。

代码:

class One {
  constructor() {
    this.nameOne = 'One';
  }

  validateOne() {
    console.log('one');
  }
}

class Two extends One {
  constructor() {
    super();
    this.nameTwo = 'Two';
  }

  validateTwo() {
    console.log('two');
  }
}

class Three extends Two {
  constructor() {
    super();
    this.nameThree = 'three';
  }

  validateThree() {
    console.log('three');
  }
}

function getAllProperties(obj) {
  function getProperty(new_obj) {
    if (new_obj.__proto__ === null) {
      // 说明该对象已经是最顶层的对象
      return [];
    }

    const properties = Object.getOwnPropertyNames(new_obj);

    return [...properties, ...getProperty(new_obj.__proto__)]; // 关键点
  }

  return getProperty(obj);
}

const three = new Three();

const data1 = getAllProperties(three); // 实例对象
const data2 = getAllProperties(Three.prototype); // 原型对象
// const data1 = Array.from(new Set(getAllProperties(three)));
// const data2 = Array.from(new Set(getAllProperties(Three.prototype)));

console.log(data1,data2);

控制台截图:
在这里插入图片描述
注意事项:

  • extends关键字继承父类的属性和方法。

  • ES6中类的定义能很有效地分割原型对象和实例对象。这是因为类块中定义的方法都会被当作原型对象上的方法,而类中用this关键字声明的属性又都属于不同的实例对象

  • 使用extends继承父类后,子类可以通过super关键字来访问父类的构造函数和静态方法。当子类没有显式定义自己的构造函数时,会默认继承父类的构造函数;若显式定义了构造函数,则必须引用super()或返回一个对象。

  • Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)组成的数组。

参考:【js】原型与原型链如何获取js类中的所有属性和方法继承和原型链

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值