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

来源:6-8 reflect-metadata

君额上似可跑马

2020-04-19

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

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 中。

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

写回答

2回答

烈霓殇

2020-12-03

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

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

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

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

0
0

Dell

2020-04-19

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

0
2
Dell
回复
哈士奇附体
是的,reflect-metadata 底层实现造成的
2020-07-04
共2条回复

专为小白设计的TypeScript入门课

Dell老师专为TypeScript小白打造的,全栈式教学TS入门课程

2213 学习 · 504 问题

查看课程