Javascript 为什么TypeScript在原型而不是对象上定义属性?
我有一个数据对象,并在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
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”的意图以及属性在外部世界中像正常值一样的想法。当您使用进行迭代时,原型中的可枚举属性将被包括在内。。。在
中。