Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么TypeScript在原型而不是对象上定义属性?_Javascript_Angularjs_Typescript - Fatal编程技术网

Javascript 为什么TypeScript在原型而不是对象上定义属性?

Javascript 为什么TypeScript在原型而不是对象上定义属性?,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,我有一个数据对象,并在TypeScript中定义了一个属性,如: get name() { return this._hiddenName; } set name(value) { ...stuff... this._hiddenName = value; } 但是当我看到输出代码时 Object.defineProperty(MyObject.prototype, "name", { 因此,属性存在于原型上,而不是对象上。当我想调用它时,这很好,但是当我想用obje

我有一个数据对象,并在TypeScript中定义了一个属性,如:

get name() {
    return this._hiddenName;
}
set name(value) {
    ...stuff...
    this._hiddenName = value;
}
但是当我看到输出代码时

Object.defineProperty(MyObject.prototype, "name", {
因此,属性存在于原型上,而不是对象上。当我想调用它时,这很好,但是当我想用object.keys()检查对象的属性时,这些属性将不会被拾取


具体地说,我正在将一个具有属性的对象以Angular方式传递到FormGroup中,该对象试图使用object.keys将对象映射到表单,该object.keys查找我的备份属性,但不查找我实际要公开的属性。

如果定义一个类,则所有方法和getter/setter都将位于原型中:

class MyObject {
  private _hiddenName: string
  get name() {
    return this._hiddenName;
  }
  set name(value) {
      this._hiddenName = value;
  }
}
但您可以定义一个对象:

let obj = {
  _hiddenName: "abc",
  get name() {
    return this._hiddenName;
  },
  set name(value) {
      this._hiddenName = value;
  }
}

这里,getter和setter在对象中。编译后的代码与TypeScript代码相同。

如果您定义了一个类,那么所有的方法和getter/setter都将在原型中:

class MyObject {
  private _hiddenName: string
  get name() {
    return this._hiddenName;
  }
  set name(value) {
      this._hiddenName = value;
  }
}
但您可以定义一个对象:

let obj = {
  _hiddenName: "abc",
  get name() {
    return this._hiddenName;
  },
  set name(value) {
      this._hiddenName = value;
  }
}

这里,getter和setter在对象中。编译后的代码与TypeScript代码相同。

没错,
name
不是自己的属性,因此它不在
Object.keys
中列出。它是在prototype上定义的,这是绝对正确的,因为您告诉它是通过使用类成员作为名称来实现的。好吧,我的假设是,属性是为封装而设计的,所以您可以使某些东西的行为就像对象上的基本值一样。事实上,JavaScript有一个“enumerable”,它使属性像对象的普通部分一样显示(在object.keys()中)。TypeScript实际上设置了“enumerable:true”,但随后将属性从对象中移除并放入原型中,这特别禁用了“enumerable:true”的意图以及属性在外部世界中像正常值一样的想法。当您使用
进行迭代时,原型中的可枚举属性将被包括在内。。。在
。没错,
名称
不是自己的属性,因此它不在
对象.keys
中列出。它是在prototype上定义的,这是绝对正确的,因为您告诉它是通过使用类成员作为名称来实现的。好吧,我的假设是,属性是为封装而设计的,所以您可以使某些东西的行为就像对象上的基本值一样。事实上,JavaScript有一个“enumerable”,它使属性像对象的普通部分一样显示(在object.keys()中)。TypeScript实际上设置了“enumerable:true”,但随后将属性从对象中移除并放入原型中,这特别禁用了“enumerable:true”的意图以及属性在外部世界中像正常值一样的想法。当您使用
进行迭代时,原型中的可枚举属性将被包括在内。。。在
中。