JavaScript 类和代理是什么
类: 这些与函数几乎相似,只是使用类关键字而不是函数关键字。函数和类之间的另一个重要区别是,函数可以在代码中被调用而无需定义,而类必须在JavaScript中构建类对象之前定义,否则运行代码将抛出引用错误。
定义一个类: 可以使用类关键字和构造函数来定义一个类。
语法:
class Classname {
constructor(property1, property2) {
this.property1 = property1;
this.property2 = property2;
}
}
示例: 以下示例描述了一个简单的类。
JavaScript
<script>
class Employee {
constructor(name, id) {
this.name = name;
this.id = id;
}
}
let Employee1 = new Employee("Suraj", 533);
console.log(Employee1);
</script>
输出:
Employee {name: 'Suraj', id: 533}
id: 533
name: "Suraj"
[[Prototype]]: Object
类表达式: 我们还可以使用类表达式来定义一个类。类表达式可以是“命名”或“未命名”两种类型。类的名称可以通过name 属性访问。
语法:
let Employee = class {
constructor(name, id) {
this.name = name;
this.id = id;
}
}
示例:
JavaScript
<script>
// Unnamed class
let Employee1 = class {
constructor(name, id) {
this.name = name;
this.id = id;
}
}
console.log(Employee1.name);
// Named class
let Employee2 = class Intern {
constructor(name, id) {
this.name = name;
this.id = id;
}
}
console.log(Employee2.name);
</script>
输出:
Employee1
Intern
类方法: 我们也可以在类内部定义方法。可以带参数,也可以不带参数。
语法:
class Classname {
constructor(property1, property2) {
this.property1 = property1;
this.property2 = property2;
}
method1() { ... }
}
示例:
JavaScript
<script>
class Employee {
constructor(name, id) {
this.name = name;
this.id = id;
}
// Without parameter
getname(){
return "Name of Employee: "+this.name;
}
// With parameter
getdept(department){
return "Works in " + department;
}
}
let Employee1 = new Employee("Suraj", 533);
console.log(Employee1.getname());
console.log(Employee1.getdept("Finance department"));
</script>
输出结果:
Name of Employee: Suraj
Works in Finance department
代理: 代理是用于重新定义对象基本操作的对象。它允许我们创建另一个对象的代理。
参数:
代理对象接受以下两个参数:
- 目标: 我们想要用代理包装的原始对象。
- 处理程序: 如果在代理上执行操作,则其属性定义代理的行为的对象。
语法:
const target = {
property1: "first property",
property2: "second property"
};
const handler = { ... };
const proxy1 = new Proxy(target, handler);
示例:
JavaScript
<script>
const target = {
property1: "GeeksforGeeks",
property2: "Computer science portal"
};
const handler = {};
const proxy = new Proxy(target, handler);
console.log(proxy.property1);
console.log(proxy.property2);
</script>
输出:
GeeksforGeeks
Computer science portal
由于处理程序为空,它不会影响目标。因此,代理行为与其原始目标相同。
我们还可以在处理程序内部定义操作,以更改代理的属性。为此,我们需要使用get() 处理程序,该处理程序可以访问目标的属性并操作代理内部的属性。的reflect 类有助于将目标的原始属性应用于代理。
示例: 我们在处理程序中应用了一个条件,来检查目标的“property2”,此时输出应该与目标的原始属性不同。
JavaScript
<script>
const target = {
property1: "GeeksforGeeks",
property2: "Computer science portal"
};
const handler = {
get: function (target, prop, receiver) {
if (prop === "property2") {
return "For computer science geeks";
}
else{
return Reflect.get(target,prop);
}
}
}
const proxy = new Proxy(target, handler);
console.log(proxy.property1);
console.log(proxy.property2);
</script>
输出:
GeeksforGeeks
For computer science geeks