getter和setter
时间: 2023-09-29 11:08:58 浏览: 48
Getter和Setter是面向对象编程中的两个重要概念,用于访问和设置对象的属性。
Getter方法用于获取对象的属性值,它通常被称为“访问器”,也就是获取器。Getter方法可以保护对象的属性不被直接访问和修改,它可以对属性值进行一些处理和验证,从而保证对象的状态正确性和安全性。
Setter方法用于设置对象的属性值,它通常被称为“修改器”。Setter方法可以保护对象的属性不被直接修改,它可以对属性值进行一些处理和验证,从而保证对象的状态正确性和安全性。
Getter和Setter方法一般都是以属性名为前缀,加上get或set的方法名来命名。在Java和Python等编程语言中,Getter和Setter方法可以使用特殊的注解来自动生成,从而简化代码编写。
相关问题
oc getter和setter
在Objective-C中,getter和setter是用来访问和修改对象属性的方法。它们可以手动编写,也可以使用@property关键字来自动生成。
getter方法用来获取属性的值,setter方法用来设置属性的值。默认情况下,如果你没有手动编写getter和setter方法,那么编译器会自动为你生成默认的getter和setter方法。默认的getter和setter方法会自动从对应的实例变量中获取或设置属性的值。
以下是手动编写getter和setter方法的示例:
```
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end
@implementation Person
- (NSString *)name {
return _name;
}
- (void)setName:(NSString *)name {
_name = name;
}
@end
```
使用@property关键字可以自动生成getter和setter方法,例如:
```
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end
@implementation Person
@end
```
这里并没有手动编写getter和setter方法,但编译器会自动为我们生成默认的getter和setter方法。
使用生成的getter和setter方法非常简单,例如:
```
Person *person = [[Person alloc] init];
person.name = @"Tom"; // 使用setter方法设置属性值
NSString *name = person.name; // 使用getter方法获取属性值
```
需要注意的是,如果你希望对属性进行自定义的访问和修改操作,例如进行类型转换、数据验证等操作,那么你可以手动编写getter和setter方法来实现。
vue3getter和setter
在Vue3中,getter和setter是通过使用属性代理的方式实现的。具体来说,Vue3使用了`Object.defineProperty`方法来对属性进行代理,从而通过`vm.xx`对`vm._data.xx`进行读写操作。在Vue的实例化过程中,会调用`observe`方法来实例化一个`Observe`类,将`vm.xx`由数据属性转变为访问器属性,并设置getter和setter。每个属性的getter都会实例化一个`Dep`类,用于收集依赖,而setter则会通知更新。当数据发生变动时,setter会触发对应属性维护的`dep`的`notify`方法,通知保存在`dep.subs`中的`Watcher`实例进行更新。这样就实现了getter和setter的功能。
然而,`Object.defineProperty`存在一些问题。首先,在`defineReactive`方法中使用getter和setter时,需要遍历递归,并使用闭包存储数据值的副本。当数据量较大时,会导致性能下降。其次,`Object.defineProperty`的代理是针对属性级别的,无法对对象级别进行代理。
为了解决这些问题,Vue3引入了新的代理方式,即`Proxy`。使用`Proxy`可以更灵活地进行属性代理。通过创建一个`Proxy`实例,可以对整个对象进行代理操作。与`Object.defineProperty`相比,`Proxy`可以动态添加和删除属性,并且可以对这些操作做出反应。在控制台修改`Proxy`的值后,页面会自动更新。相比之下,使用`Object.defineProperty`需要在`data`中定义属性并为每个属性调用`Object.defineProperty`方法设置getter和setter,而且无法对delete操作做出反应。
综上所述,Vue3中通过属性代理实现了getter和setter的功能。`Object.defineProperty`是Vue3早期使用的方式,但由于其存在的问题,Vue3后续引入了`Proxy`,使得代码更具有抽象性。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [关于Vue3.x选用proxy放弃访问器属性(setter/getter)的一点理解。](https://blog.csdn.net/weixin_33724059/article/details/91422102)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]