JavaScript中反射的概念是什么?

时间:2018-11-06 10:41:23

标签: javascript ecmascript-6

任何人都可以用人类语言和简单的示例来解释它(反射和内置的Reflect对象)如何在JS中工作。

Wikipedia:“在计算机科学中,反射是计算机程序在运行时检查,自省和修改其自身的结构和行为的能力。”

2 个答案:

答案 0 :(得分:2)

什么是反射?

  • 对象可以查看自身,列出并更改其属性和方法。
  • 因此JavaScript对象可以查看自己的属性和方法。
  • 反映是指检查程序的结构及其数据。
  • 程序的语言是编程语言PL,进行检查的语言是元编程语言MPL。 PL和MPL可以使用相同的语言。
  • Javascript允许我们检查自己的程序的方式有多种。

1。要遍历对象的成员

  • 示例:
var person = {
    fname: "Default",
    lname: "Default",
    getFullName: function(){
        return this.fname + " " + this.lname;
    }
}

var john = {
    fname: "John",
    lname: "Doe"
}

john.__proto__ = person;

//Reflection : Iterate over the members of an object
for(var prop in john){
    console.log(prop + " : " + john[prop]);
}

输出: enter image description here

注意::检查对象的属性时,JavaScript的默认设置是包含继承的属性。

  • 为了遍历对象的所有直接成员,自身成员或非继承成员,我们可以使用hasOwnProperty()。
  • hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定的属性作为其自身的属性(而不是继承它)。
  • 语法:
obj.hasOwnProperty(prop)
  • 示例:
var person = {
    fname: "Default",
    lname: "Default",
    getFullName: function(){
        return this.fname + " " + this.lname;
    }
}

var john = {
    fname: "John",
    lname: "Doe"
}

john.__proto__ = person;

//Reflection : Iterate over the direct or own members of an object
for(var prop in john){
    if(john.hasOwnProperty(prop)){
           console.log(prop + " : " + john[prop]);
       }
}

输出: enter image description here

  • Object.getOwnPropertyNames()方法返回直接在给定对象中找到的所有属性(包括那些使用Symbol的属性除外)的属性的数组。
var person = {
    fname: "Default",
    lname: "Default",
    getFullName: function(){
        return this.fname + " " + this.lname;
    }
}

var john = {
    fname: "John",
    lname: "Doe"
}

john.__proto__ = person;

//Reflection : Iterate over the direct or own members of an object using Object.getOwnPropertyNames()
console.log(Object.getOwnPropertyNames(john));//["fname", "lname"]
  • Object.getOwnPropertyDescriptor()方法返回给定对象的自身属性(即,直接存在于对象上而不是对象原型链中的属性)的属性描述符。
//Reflection : Getting the property descriptor for an own property of object
console.log(Object.getOwnPropertyDescriptor(person, 'getFullName'));//{writable: true, enumerable: true, configurable: true, value: ƒ}
  • 此处:

    1. value:与属性关联的值(仅数据描述符)。
    2. 可写:当且仅当与该属性关联的值可以更改时才为true(仅数据描述符)。
    3. configurable:仅当可以更改此属性描述符的类型并且可以从相应对象中删除该属性时,才为true。
    4. enumerable:当且仅当在枚举相应对象的属性时显示此属性时,才为true。
  • 静态方法 Object.defineProperty()直接在对象上定义新属性,或修改对象上的现有属性,然后返回对象。

  • 语法:
Object.defineProperty(obj, prop, descriptor)
  • 默认情况下,使用Object.defineProperty()添加的值是不可变的。

2。检查对象的所有属性 -如果要区分对象的属性和方法,可以使用运算符typeof返回一个字符串,该字符串标识被分析元素的类型。

//Reflection : To examine all the properties of an object
for(var prop in person){
    if(typeof person[prop] != 'function'){
        console.log(prop + " : " + john[prop]);
       }
}
//OUTPUT:
//fname : John
//lname : Doe

3。检查对象的所有方法

//Reflection : To examine all methods of an object
for(var prop in person){
    if(typeof person[prop] == 'function'){
        console.log(prop + " : " + john[prop]);
       }
}
//OUTPUT:
//getFullName : function(){
//        return this.fname + " " + this.lname;
//    }

JavaScript在ES5中已经具有反射功能,即使未通过规范或社区将其命名为反射。诸如Array.isArray,Object.getOwnPropertyDescriptor和Objects.keys之类的方法的行为与反射所展现的特征非常相似。 ES6中内置的Reflect现在包含此类别中的方法。

答案 1 :(得分:1)

反射是元编程的一部分。

  

元编程是一种编程技术,其中计算机程序具有将程序视为其数据的能力。这意味着程序可以设计为读取,生成,分析或转换其他程序,甚至在运行时对其进行修改。

反射的概念是,就像我们在镜子中看到反射一样:我们可以看到没有反射就无法看到的东西,例如:我们的头发,嘴唇,舌头等。

简而言之,如果方法或类将其称为反射对象,则它可以看到其知识以外的对象,例如:实例变量,该类具有的方法列表以及其他属性,该类称为该方法。

这在我们进行元编程时很有用。方法或类应该意识到他们(甚至作家)所不了解的事物。

具体示例: 可以说水和杯子。如果要对水物理学进行编程以适合杯子,则有很多方法。假设您与100个其他开发人员一起工作,却不知道他们会拿出什么样的容器(有人可能最终会遇到湖泊甚至河流),然后选择元编程风格。你有班水和班杯。您的水上班必须注意杯子的属性,例如:最大容积,重量,曲线,甚至最高/最低温度。

结果:每当有人调用class water时,您都不必插入这些信息作为参数,因为如果数量增加,可能很难跟踪。

(我不确定这是否是一个足够好的示例和解释,所以如果您不介意,请发表一个更好的评论)