Decorator装饰器(stage 2提案)

 

一 类装饰器

 

1 直接创建

 

@sealed
class Dog {
	bark() {
		console.log('汪~');
	}
}

// 装饰器
function sealed(target){
   Object.seal(target);
   Object.seal(target.prototype);
}

// 不能添加新属性(Uncaught TypeError: Cannot add property nick, object is not extensible)
Dog.nick = '狗狗';
console.log(Dog.nick); // undefined

 

2 使用装饰器工厂

 

@testable(true)
class Greeter {
	greet() {
		console.log(`hello`);
	}
}

// 装饰器工厂
function testable(isTestable) {
    // 返回装饰器
	return function(target){
		target.isTestable = isTestable;
	}
}

Greeter.isTestable // true

 

二 方法装饰器

 

1 取值函数(gettter)、存值函数(setter)

 

class Person{
  
 children = [];
  
 @nonenumerable
 get kidCount(){
 	return this.children.length;
 }
  
}

// 装饰器
function nonenumerable(target,name,descriptor){
  descriptor.enumerable = false;
  return descriptor;
}

console.log(Object.keys(Person.prototype)); // []

 

2 普通方法

 

class Math{
	@log
	add(a,b){
		return a + b;
	}
}

// 装饰器
function log(target,name,descriptor){
	var oldValue = descriptor.value;
	
	descriptor.value = function(){
		console.log(`调用${name}方法`);
		return oldValue.apply(null,arguments);
	}
	
    // 返回新的属性描述符
	return descriptor;
}

new Math().add(1,2); // "调用add方法"

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值