getter - JavaScript - MDN Web Docs - Mozilla
文章推薦指數: 80 %
getter. get 语法将对象属性绑定到查询该属性时将被调用的函数。
... 尽管可以结合使用getter 和setter 来创建一个伪属性,但是不可能同时将 ...
SkiptomaincontentSkiptosearchSkiptoselectlanguageWeb开发技术JavaScriptJavaScript参考函数getterArticleActions中文(简体)此页面由社区从英文翻译而来。
了解更多并加入MDNWebDocs社区。
尝试一下语法描述示例规范浏览器兼容性相关链接RelatedTopics
JavaScript
教程:
快速入门
JavaScript基础知识
JavaScript第一步
创建JavaScript代码块
介绍JavaScript对象
JavaScript指南
介绍
语法和数据类型
流程控制与错误处理
循环与迭代
函数
表达式与运算符
数字和日期
文本格式化
正则表达式
索引集合类
带键的集合
使用对象
使用类
使用Promise
迭代器和生成器
元编程
JavaScript模块
中级教程
客户端JavaScript框架
客户端WebAPI
语言概述
JavaScript数据结构
如何正确判断相等性
闭包
高级
继承和原型链
严格模式
JavaScript类型化数组
内存管理
并发模型与事件循环
参考:
内置对象
概述AggregateErrorArrayArrayBufferAsyncFunctionAsyncGeneratorAsyncGeneratorFunctionAtomicsBigIntBigInt64ArrayBigUint64ArrayBooleanDataViewDatedecodeURI()decodeURIComponent()encodeURI()encodeURIComponent()Error
已弃用
escape()eval()EvalErrorFinalizationRegistryFloat32ArrayFloat64ArrayFunctionGeneratorGeneratorFunctionglobalThisInfinityInt16ArrayInt32ArrayInt8Array
非标准
InternalErrorIntlisFinite()isNaN()JSONMapMathNaNNumberObjectparseFloat()parseInt()PromiseProxyRangeErrorReferenceErrorReflectRegExpSetSharedArrayBufferStringSymbolSyntaxErrorTypedArrayTypeErrorUint16ArrayUint32ArrayUint8ArrayUint8ClampedArrayundefined
已弃用
unescape()URIErrorWeakMapWeakRefWeakSet
表达式和运算符
概述Addition(+)Additionassignment(+=)Assignment(=)asyncfunctionexpressionasyncfunction*expressionawaitBitwiseAND(&)BitwiseANDassignment(&=)BitwiseNOT(~)BitwiseOR(|)BitwiseORassignment(|=)BitwiseXOR(^)BitwiseXORassignment(^=)classexpressionCommaoperator(,)Conditional(ternary)operatorDecrement(--)deleteoperatorDestructuringassignmentDivision(/)Divisionassignment(/=)Equality(==)Exponentiation(**)Exponentiationassignment(**=)Functionexpressionfunction*expressionGreaterthan(>)Greaterthanorequal(>=)Groupingoperator()importimport.metainoperatorIncrement(++)Inequality(!=)instanceofLeftshift(<>)Rightshiftassignment(>>=)Spreadsyntax(...)Strictequality(===)Strictinequality(!==)Subtraction(-)Subtractionassignment(-=)superthistypeofUnarynegation(-)Unaryplus(+)Unsignedrightshift(>>>)Unsignedrightshiftassignment(>>>=)voidoperatoryieldyield*
语句和声明
概述asyncfunctionasyncfunction*blockbreakclassconstcontinuedebuggerdo...whileemptyexportforforawait...offor...infor...offunctiondeclarationfunction*if...elseimportlabelletreturnswitchthrowtry...catchvarwhile
已弃用
with
函数
概述TheargumentsobjectArrowfunctionexpressionsDefaultparametersgetterMethoddefinitionsRestparameterssetter
类
概述ClassstaticinitializationblocksconstructorextendsPrivateclassfeaturesPublicclassfieldsstatic
错误
概述Warning:-file-isbeingassigneda//#sourceMappingURL,butalreadyhasoneTypeError:invalidArray.prototype.sortargumentWarning:08/09isnotalegalECMA-262octalconstantRangeError:radixmustbeanintegerSyntaxError:invalidregularexpressionflag"x"SyntaxError:returnnotinfunctionRangeError:BigIntdivisionbyzeroRangeError:BigIntnegativeexponentTypeError:X.prototype.ycalledonincompatibletypeReferenceError:can'taccesslexicaldeclaration'X'beforeinitializationTypeError:can'tassigntoproperty"x"on"y":notanobjectRangeError:xcan'tbeconvertedtoBigIntbecauseitisn'tanintegerTypeError:can'tconvertBigInttonumberTypeError:can'tconvertxtoBigIntTypeError:can'tdefineproperty"x":"obj"isnotextensibleTypeError:property"x"isnon-configurableandcan'tbedeletedTypeError:can'tredefinenon-configurableproperty"x"SyntaxError:cannotuse`??`unparenthesizedwithin`||`and`&&`expressionsTypeError:cyclicobjectvalueTypeError:can'taccessdeadobjectSyntaxError:applyingthe'delete'operatortoanunqualifiednameisdeprecatedReferenceError:deprecatedcallerorargumentsusageWarning:expressionclosuresaredeprecatedSyntaxError:"0"-prefixedoctalliteralsandoctalescapeseq.aredeprecatedSyntaxError:Using//@toindicatesourceURLpragmasisdeprecated.Use//#insteadWarning:String.xisdeprecated;useString.prototype.xinsteadWarning:Date.prototype.toLocaleFormatisdeprecatedSyntaxError:testforequality(==)mistypedasassignment(=)?TypeError:settinggetter-onlyproperty"x"SyntaxError:Unexpected'#'usedoutsideofclassbodySyntaxError:identifierstartsimmediatelyafternumericliteralSyntaxError:illegalcharacterTypeError:cannotuse'in'operatortosearchfor'x'in'y'RangeError:invalidarraylengthSyntaxError:invalidassignmentleft-handsideSyntaxError:invalidBigIntsyntaxTypeError:invalidassignmenttoconst"x"RangeError:invaliddateSyntaxError:for-inloopheaddeclarationsmaynothaveinitializersSyntaxError:adeclarationintheheadofafor-ofloopcan'thaveaninitializerTypeError:invalid'instanceof'operand'x'TypeError:'x'isnotiterableSyntaxError:JSON.parse:badparsingSyntaxError:MalformedformalparameterURIError:malformedURIsequenceSyntaxError:missing]afterelementlistSyntaxError:missing:afterpropertyidSyntaxError:missing}afterfunctionbodySyntaxError:missing}afterpropertylistSyntaxError:missingformalparameterSyntaxError:missing=inconstdeclarationSyntaxError:missingnameafter.operatorSyntaxError:missing)afterargumentlistSyntaxError:missing)afterconditionSyntaxError:missing;beforestatementTypeError:MoreargumentsneededRangeError:repeatcountmustbenon-negativeTypeError:"x"isnotanon-nullobjectTypeError:"x"hasnopropertiesSyntaxError:missingvariablenameTypeError:can'tdeletenon-configurablearrayelementRangeError:argumentisnotavalidcodepointTypeError:"x"isnotaconstructorTypeError:"x"isnotafunctionReferenceError:"x"isnotdefinedRangeError:precisionisoutofrangeError:Permissiondeniedtoaccessproperty"x"TypeError:"x"isread-onlySyntaxError:redeclarationofformalparameter"x"TypeError:ReduceofemptyarraywithnoinitialvalueSyntaxError:"x"isareservedidentifierRangeError:repeatcountmustbelessthaninfinityWarning:unreachablecodeafterreturnstatementSyntaxError:"usestrict"notallowedinfunctionwithnon-simpleparametersInternalError:toomuchrecursionReferenceError:assignmenttoundeclaredvariable"x"ReferenceError:referencetoundefinedproperty"x"SyntaxError:UnexpectedtokenTypeError:"x"is(not)"y"SyntaxError:functionstatementrequiresanameSyntaxError:unparenthesizedunaryexpressioncan'tappearontheleft-handsideof'**'SyntaxError:unterminatedstringliteral
更多
JavaScript知识概要
词法文法
JavaScript数据结构
属性的可枚举性和所有权
迭代协议
严格模式
切换到严格模式
模板字符串
尾后逗号
已废弃的特性
尝试一下语法描述示例规范浏览器兼容性相关链接getterget语法将对象属性绑定到查询该属性时将被调用的函数。
尝试一下语法{getprop(){...}}
{get[expression](){...}}
参数
prop
要绑定到给定函数的属性名。
expression
从ECMAScript2015开始,还可以使用一个计算属性名的表达式绑定到给定的函数。
描述有时需要允许访问返回动态计算值的属性,或者你可能需要反映内部变量的状态,而不需要使用显式方法调用。
在JavaScript中,可以使用getter来实现。
尽管可以结合使用getter和setter来创建一个伪属性,但是不可能同时将一个getter绑定到一个属性并且该属性实际上具有一个值。
使用get语法时应注意以下问题:
可以使用数值或字符串作为标识;
必须不带参数(请参考IncompatibleES5change:literalgetterandsetterfunctionsmustnowhaveexactlyzerooronearguments);
它不能与另一个get或具有相同属性的数据条目同时出现在一个对象字面量中(不允许使用{getx(){},getx(){}}和{x:...,getx(){}})。
示例在新对象初始化时定义一个getter这会为obj创建一个伪属性latest,它会返回log数组的最后一个元素。
constobj={
log:['example','test'],
getlatest(){
if(this.log.length==0)returnundefined;
returnthis.log[this.log.length-1];
}
}
console.log(obj.latest);//"test".
注意,尝试为latest分配一个值不会改变它。
使用delete操作符删除getter只需使用delete,就可删除getter:
deleteobj.latest;
使用defineProperty在现有对象上定义getter要随时将getter添加到现有对象,使用Object.defineProperty().
varo={a:0}
Object.defineProperty(o,"b",{get:function(){returnthis.a+1;}});
console.log(o.b)//Runsthegetter,whichyieldsa+1(whichis1)
使用计算出的属性名varexpr='foo';
varobj={
get[expr](){return'bar';}
};
console.log(obj.foo);//"bar"
智能/自我复写/懒加载gettersGetters给你一种方法来定义一个对象的属性,但是在访问它们之前不会计算属性的值。
getter延迟计算值的成本,直到需要此值,如果不需要,您就不用支付成本。
一种额外的优化技术是用智能(或称记忆化)getters延迟属性值的计算并将其缓存以备以后访问。
该值是在第一次调用getter时计算的,然后被缓存,因此后续访问返回缓存值而不重新计算它。
这在以下情况下很有用:
如果属性值的计算是昂贵的(占用大量RAM或CPU时间,产生工作线程,检索远程文件等)。
如果现在不需要该值。
它将在稍后使用,或在某些情况下它根本不使用。
如果被使用,它将被访问几次,并且不需要重新计算,该值将永远不会被改变,或者不应该被重新计算。
备注:这意味着你不应该为你希望更改其值的属性使用懒getter,因为getter不会重新计算该值。
在以下示例中,对象具有一个getter属性。
在获取属性时,该属性将从对象中删除并重新添加,但此时将隐式显示为数据属性。
最后返回得到值。
getnotifier(){
deletethis.notifier;
returnthis.notifier=document.getElementById('bookmarked-notification-anchor');
},
对于Firefox代码,另请参阅定义defineLazyGetter()函数的XPCOMUtils.jsm代码模块。
getvs.defineProperty当使用get关键字时,它和Object.defineProperty()有类似的效果,在classes中使用时,二者有细微的差别。
当使用get关键字时,属性将被定义在实例的原型上,当使用Object.defineProperty()时,属性将被定义在实例自身上。
classExample{
gethello(){
return'world';
}
}
constobj=newExample();
console.log(obj.hello);
//"world"
console.log(Object.getOwnPropertyDescriptor(obj,'hello'));
//undefined
console.log(
Object.getOwnPropertyDescriptor(
Object.getPrototypeOf(obj),'hello'
)
);
//{configurable:true,enumerable:false,get:functiongethello(){return'world';},set:undefined}
规范SpecificationECMAScriptLanguageSpecification#sec-method-definitions浏览器兼容性BCDtablesonlyloadinthebrowser相关链接
setter
delete
Object.defineProperty()
__defineGetter__(en-US)
__defineSetter__(en-US)
在Javascript指南中定义Getters和Setters
Foundaproblemwiththispage?EditonGitHubSourceonGitHubReportaproblemwiththiscontentonGitHubWanttofixtheproblemyourself?SeeourContributionguide.Lastmodified:2022年9月21日,byMDNcontributors
延伸文章資訊
- 1javascript中getter和setter有什么用? - SegmentFault 思否
getter和setter不就是赋值与获取值的意思吗? var obj = {}; obj.name="john" 这 ... 前面已经有人讲了拦截的作用,我这里补充一下,如有错误请指出。
- 2getter - JavaScript - MDN Web Docs - Mozilla
getter. get 语法将对象属性绑定到查询该属性时将被调用的函数。 ... 尽管可以结合使用getter 和setter 来创建一个伪属性,但是不可能同时将 ...
- 3什么是js中的getter 和setter? - CSDN博客
Getter/Setter是一个万恶的概念,其实就是一个规定好参数和context的函数标准。let obj = { a:1, b:0}取a的值obj.a 就是getter设置a的值obj.a=...
- 4getter/setter - iT 邦幫忙::一起幫忙解決難題,拯救IT 人的一天
- 5属性的getter 和setter - 现代JavaScript 教程
访问器属性由“getter” 和“setter” 方法表示。在对象字面量中,它们用 get ... propName 时,getter 起作用 }, set propName(value) { ...