请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

类里的属性是实例属性啊, 为什么装饰器里要传递targetclassPrototype

// 2. 属性装饰器
function loginProperty(attrValue) {
    return function (targetclassPrototype, attrname) {
        console.log("targetclassPrototype:", targetclassPrototype);
        console.log("attrname:", attrname);
        targetclassPrototype.constructor.custLevelDescri = function () {
            console.log("消费5000元升级为贵宾");
            console.log("消费10000元升级为贵宾,赠送微波炉一个");
        };
    };
}

// 3.目标类
var CustomerService = /** @class */ (function () {
    function CustomerService() {
        this.custname = "王五";
    }
    CustomerService.prototype.show = function () {
        console.log("顾客名:", this.custname);
    };
    __decorate([
        loginProperty("顾客登记")
    ], CustomerService.prototype, "degree");
    return CustomerService;
}());
CustomerService.custLevelDescri();

上面贴的是课件里的源码, 只有实例化一个类的时候才能操作属性呀, 上面的装饰器仅仅是在类上加了一个静态方法, 和属性完全不沾边呀
而且讲道理属性装饰器传递targetClass不是比targetClassPrototype更方便吗, TS这么设计是有什么考量吗

正在回答 回答被采纳积分+3

1回答

keviny79 2021-10-07 19:34:01
  •    属性和属性装饰器的意义要分开,  TS 设计 属性装饰器 设计的主要目的 并不是为了获得属性的值,或者对属性的值进行什么操作 【实际上 绝大多数场景并不需要获取属性的值】,   TS 设计 属性装饰器 设计的目的 是为了能实现 “依赖注入”,外部可以再不创建对象的情况下为属性 分配一个对象(注入) ,这一点本章10-31 后有详尽的讲解,所以传递一个原型参数给属性装饰器反而 更加好,因为原型可以获取到的对象更多,防止偶尔用到。

  • 这里静态方法只是一个属性装饰器的测试例子,不必理会,真正的 仿 Nestjs 实战中有属性装饰器的应用场景

 

1 回复 有任何疑惑可以回复我~
  • 提问者 crazyones110 #1
    我还有一点不理解的是, reflect-metadata这个包是如何在原型上拿到实例属性的, 即使通过`prototype.constructor`, javascript里实例属性也是定义在`prototype.constructor`这个函数体里面的
    回复 有任何疑惑可以回复我~ 2021-10-07 20:11:09
  • keviny79 回复 提问者 crazyones110 #2
    // 通过原型,底层加装了一层,思想是这样来拿到属性,大致步骤如下:当然还有其他细节。
    function Person () {
      this.name = "name"
    }
    
    Person.prototype.eat = function () {
      console.log("eat:", this.name);
    }
    
    // 1
    var obj = new Object();
    
    // 2.让新创建的对象的 __proto__ 变量指向 Person 原型对象空间
    obj.__proto__ = Person.prototype;
    
    //3 
    Person.apply(obj, []);
    // 
    obj.eat();
    console.log("111", obj.name);// 实例属性
    回复 有任何疑惑可以回复我~ 2021-10-07 20:39:49
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信