在Ember.js中,get(obj, 'prop')
和 obj.get('prop')
都是用于获取对象属性的方法,但它们的实现方式和适用场景略有不同。以下是详细对比:
obj.get('prop')
是Ember.Object实例的原生方法,直接通过对象调用。obj.get('prop')
是Ember.Object实例的原生方法,直接通过对象调用。get(obj, 'prop')
是Ember提供的工具函数(来自@ember/object
模块),通过函数式方式调用。get(obj, 'prop')
是Ember提供的工具函数(来自@ember/object
模块),通过函数式方式调用。| 特性 | obj.get('prop')
| get(obj, 'prop')
|
|------------------------|--------------------------------------------|----------------------------------------|
| 调用方式 | 面向对象风格(方法调用) | 函数式风格(工具函数调用) |
| 兼容性 | 仅适用于Ember.Object
或其子类实例 | 支持普通JS对象、Ember对象、Proxy对象等 |
| 计算属性支持 | 自动触发计算属性(Computed Properties) | 同样支持计算属性 |
| TS类型推断 | 类型推断更直观(通过Ember类型定义) | 需要手动声明泛型 |
| 链式调用 | 可直接链式调用(如obj.get('a.b.c')
) | 需要嵌套调用(如get(get(obj, 'a'), 'b')
) |
obj.get('prop')
Ember.Object
实例;obj.get('user.address.city')
)。get(obj, 'prop')
Ember.Object
的场景(如第三方库返回的对象)。obj.get('prop')
内部调用Ember的getter
系统,自动处理计算属性和依赖跟踪。obj.get('prop')
内部调用Ember的getter
系统,自动处理计算属性和依赖跟踪。get(obj, 'prop')
通过统一入口函数检查对象类型,决定如何获取属性:get(obj, 'prop')
通过统一入口函数检查对象类型,决定如何获取属性:obj.prop
直接访问不生效?A: Ember的计算属性或依赖系统需要通过get()
方法触发。直接访问会跳过依赖跟踪,导致数据不一致。
get
吗?A: 在Ember 3.1+后,原生支持JavaScript的Proxy
和装饰器(如@tracked
),可以逐步减少get
/set
的使用。但旧项目仍需兼容。
import { get } from '@ember/object';
import EmberObject, { computed } from '@ember/object';
const Person = EmberObject.extend({
fullName: computed('firstName', 'lastName', function() {
return `${this.get('firstName')} ${this.get('lastName')}`;
})
});
const person = Person.create({
firstName: 'John',
lastName: 'Doe'
});
// 两种方式等效
console.log(person.get('fullName')); // "John Doe"
console.log(get(person, 'fullName')); // "John Doe"
obj.get()
是面向对象方法,get()
是工具函数。get()
更通用,obj.get()
更符合Ember习惯。@tracked
和原生属性访问。没有搜到相关的文章