OOP Javascript - Getter & Setters



我一直在研究javascript中的一些oop原则,但我有一些与代码限制有关的问题。在 C# 和 Java 中,我们可以轻松地进行这种限制并查看结果,但在 JavaScript 中,我并不完全了解幕后发生的事情。

无论如何,我正在尝试创建一个人们基本上无法在外面更改它的代码。这就是为什么我了解到我们应该使用局部变量而不是创建对象属性,并且通过使用getFunction作为我们可以从外部读取的方法。

另一种方法是使用"Object.defineProperty">(Getters&Setters(

所有这些对于原始类型都非常有效,但我想我们有一些问题。我不能将我的代码限制为只读。无需编写任何 setter 方法,由于引用类型功能,我可以更改值。那么我该如何处理这个问题呢?

// Abstraction
function Circle(radius) {
this.radius = radius;
let defaultLocation = { x: 0, y: 0 };
let color = 'red';
this.getDefaultLocation = function() {
return defaultLocation;
}
this.draw = function(){
for (let key in defaultLocation) {
console.log(key, defaultLocation[key]);
}
console.log('drawn');
};
// This can be changed from outside without set(){}
Object.defineProperty(this, 'defaultLocation', {
get(){
console.log('get function');
return defaultLocation;
}
});
// This needs set(){} to be changed
Object.defineProperty(this, 'color', {
get(){
console.log('get function');
return color;
},
set(value){
color = value;
}
});
}
const circle = new Circle(10);

你说

我正在尝试创建一个人们基本上无法在外面更改它的代码。

请参阅另一个堆栈溢出问题。您可以使用 ES6 类语法,如下所示

class Circle {
constructor(radius) {
this.radius = radius;
}
get defaultLocation() {
return { x: 0, y: 0 }; // Read-only
}
get color() {
return 'red'; // Read-only
}
}
let test = new Circle(2);
console.log(test.defaultLocation); // {x: 0, y: 0}
test.defaultLocation = 10; // No error but won't do anything
console.log(test.defaultLocation); // {x: 0, y: 0}

如果你只想要一个get()函数,你可以使用构造函数(不是最新的 ECMAScript 语法(,块范围 (let( 变量是私有实例变量。关键是不要使用this关键字。

function Circle(r = 0) {
// Private
let raduis = r

// Public
this.getRaduis = function() {
return raduis
}
}
let circle = new Circle(1)
console.log(circle.getRaduis())
console.log(circle.raduis)

输出:

1
undefined

您可以向defineProperty添加其他选项。这有效地创建了一个final static常量。只需设置writeable = false.

Object.defineProperty(Circle, 'constants', {
value : {
constant  : 0,
operation : () => {
console.log('Some non-primitive')
}
},
writable     : false,
enumerable   : false,
configurable : false
});
Circle.constants.operation()

输出:

Some non-primitive

请参阅文档的"可写属性"部分。

最新更新