任何人都可以用人类语言和简单的示例来解释它(反射和内置的Reflect对象)如何在JS中工作。
Wikipedia:“在计算机科学中,反射是计算机程序在运行时检查,自省和修改其自身的结构和行为的能力。”
答案 0 :(得分:2)
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]);
}
注意::检查对象的属性时,JavaScript的默认设置是包含继承的属性。
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]);
}
}
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"]
//Reflection : Getting the property descriptor for an own property of object
console.log(Object.getOwnPropertyDescriptor(person, 'getFullName'));//{writable: true, enumerable: true, configurable: true, value: ƒ}
此处:
静态方法 Object.defineProperty()直接在对象上定义新属性,或修改对象上的现有属性,然后返回对象。
Object.defineProperty(obj, prop, descriptor)
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时,您都不必插入这些信息作为参数,因为如果数量增加,可能很难跟踪。
(我不确定这是否是一个足够好的示例和解释,所以如果您不介意,请发表一个更好的评论)