我知道回复晚了,但是似乎没有人跟进你的回复:
我们知道类实际上是原型的一种简写,在构造函数方法中,我们可以初始化对象。然而,我想在类定义中但在构造函数方法之外定义其原型中的一个属性。
您可以继续像以前那样声明类:
class Circle {
constructor (radius) {
this._radius = radius;
}
}
然后像这样定义属性:
Object.defineProperties(obj, {
radius: {
get: function () {
return this._radius;
},
set: function (n) {
this._radius = n;
}
},
area: {
get: function () {
return Math.PI * this._radius * this._radius;
},
set: function (n) {
this._radius = Math.sqrt(n / Math.PI);
}
}
});
或者您想要的任何getter和setter。
我在_radius
成员变量前加了一个下划线,以将其区分为与添加的radius
属性不同的成员变量,因为否则它们都将是this.radius,如果您尝试设置它,会导致堆栈溢出。
但是您问如何将prop定义放在单独的函数中,我的第一个想法是如何在多个Circle实例中执行此操作...
因此,这里有一个完整的工作示例,其中包含两个Circle定义,从单独的函数添加props,以及CodePen的链接:
https://codepen.io/appurist/pen/ZEbOdeB?editors=0011
class Circle {
constructor(r) {
this._radius = r;
addProps(this);
}
}
function addProps(obj) {
Object.defineProperties(obj, {
radius: {
get: function () {
return this._radius;
},
set: function (n) {
this._radius = n;
}
},
area: {
get: function () {
return Math.PI * this._radius * this._radius;
},
set: function (n) {
this._radius = Math.sqrt(n / Math.PI);
}
}
});
}
let circle = new Circle(7);
let circle2 = new Circle(2);
console.log(`circle radius and area are: ${circle.radius} ${circle.area}`);
circle.radius = 4;
console.log(`circle radius and area now: ${circle.radius} ${circle.area}`);
circle.area = 78.53981633974483;
console.log(`circle radius and area now: ${circle.radius} ${circle.area}`);
console.log(`circle2 radius and area are: ${circle2.radius} ${circle2.area}`);
circle2.radius = 3;
console.log(`circle2 radius and area now: ${circle2.radius} ${circle2.area}`);
circle2.area = 50.26548245743669;
console.log(`circle2 radius and area now: ${circle2.radius} ${circle2.area}`);
以上的输出内容为:
上述内容的输出为:
circle radius and area are: 7 153.93804002589985
circle radius and area now: 4 50.26548245743669
circle radius and area now: 5 78.53981633974483
circle2 radius and area are: 2 12.566370614359172
circle2 radius and area now: 3 28.274333882308138
circle2 radius and area now: 4 50.26548245743669
name = val
中的name
是什么?我不明白。你能解释一下你想要实现什么吗? - Felix KlingObject.getOwnPropertyDescriptors(Person.prototype)
。 - Константин Ван