请稍等 ...
×

采纳答案成功!

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

请问类上定义的属性究竟是实例上的属性还是原型上的属性

我记得之前讲给类中的属性添加装饰器大概是这样的

function nameDecorator(target: any, key: string) {
  console.log(target, key);
  target[key] = "原型中的 name";
}

class Test {
  @nameDecorator
  name: string = '实例';
}

let test = new Test();
console.log(test.name); // 实例
console.log((test as any).__proto__.name); // 原型中的 name

上面的代码我的理解是类中定义的name属性是在实例上,而不是 prototype 中。

而这集里,让我有疑惑的是下面的代码
图片描述

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

2回答

烈霓殇 2020-12-03 17:57:41

我对这个的理解是这样的:

  1. 类的属性是定义在实例对象上的,实例对象可以访问。

  2. 类的属性装饰器,接收了两个参数,一个target(原型对象),一个是key(属性名),所以属性装饰器定义或修改的是原型对象上的属性,因此对实例对象上的属性无影响。

  3. 用reflect-metadata 给类的属性添加元数据时,这种写法就是在给类添加属性装饰器,参考2,可以确定元数据其实是添加在了类的原型对象上。

0 回复 有任何疑惑可以回复我~
Dell 2020-04-19 23:14:42

prototype 去掉你打印出来的是什么?这块确实会有疑问

0 回复 有任何疑惑可以回复我~
  • 按照道理来说定义在class上面的属性应该是实例对象才能访问的,为什么这里是这个原型对象上面的,是不是跟这个reflect-metadata有关呢
    回复 有任何疑惑可以回复我~ 2020-06-30 23:34:47
  • Dell 回复 哈士奇附体 #2
    是的,reflect-metadata 底层实现造成的
    回复 有任何疑惑可以回复我~ 2020-07-04 16:25:05
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信