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方法"

 

 

 

 

 


版权声明:本文为weixin_45895753原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。