Javascript JS是否可以将getter和setter方法命名为与属性相同的方法?
我想实现代码中的行为:Javascript JS是否可以将getter和setter方法命名为与属性相同的方法?,javascript,setter,getter,Javascript,Setter,Getter,我想实现代码中的行为: function Foo(name) { this.name = name; }; var myFoo = new Foo('myName'); myFoo.name('newMyName'); // sets myFoo.name = 'newMyName' myFoo.name(); // returns 'myName' 但很明显,在这种情况下,我将用name函数覆盖name属性。无论如何都有可能实现该功能吗?在javascript中谈论getter和
function Foo(name) {
this.name = name;
};
var myFoo = new Foo('myName');
myFoo.name('newMyName'); // sets myFoo.name = 'newMyName'
myFoo.name(); // returns 'myName'
但很明显,在这种情况下,我将用name函数覆盖name属性。无论如何都有可能实现该功能吗?在javascript中谈论getter和setter时,您可能会谈论以下两个概念之一: 1.getter和setter作为一个概念,与任何其他OO语言中的概念一样。 这就是您问题中的代码所说明的情况。在这种情况下,一个对象的属性就是一个简单的属性,一个可以或者是对象或者函数的属性。javascript在同一名称空间中跟踪这两个名称。事实上,函数只是javascript中的对象,所以对于像C这样的语言中的函数,没有单独名称空间的概念 在本例中,“getter”和“setter”只是常规函数,因此值需要单独存储。围绕这一点,有几种策略 一种是使用Java中常见的隐式
getSomething()
和setSomething()
样式的函数。这允许您从属性名称中消除getter和setter的歧义,因为getter和setter在名称中添加了单词“get”和“set”
第二个策略是你在问题中写的策略。在这种情况下,您需要以另一个名称存储属性,以便不与getter/setter共享相同的名称
第三种策略是在闭包中存储值:
function Foo (name) {
var name = name;
this.name = function (str) {
if (str !== undefined) name = str;
return name;
}
}
注意,在上面的代码中,值存储在name
中,但getter/setter是this.name
,这是一个完全不同的变量。这允许示例代码按预期工作:
var me = new Foo('Mark');
me.name(); // returns Mark
me.name('Andy'); // sets name to Andy
2.getter和setter作为javascript中的一种机制。
这是遵循ECMAscript 5规范的较新版本javascript的一个特性。此功能允许属性在读取或写入代码时执行代码,类似于DOM对象的.innerHTML
属性在为其分配内容时调用HTML解析器的方式
getter和setter的语法与函数类似,但引入了get
和set
关键字来代替function
具有getter和setter的属性的简单示例:
var me = {
first_name : "",
last_name : "",
get name() {
return this.first_name + " " + this.last_name;
},
set name(str) {
var n = str.split(/\s+/);
this.first_name = n.shift();
this.last_name = n.join(' ');
}
}
上面的代码允许您将函数视为变量而不是函数来获取和设置first\u name
和last\u name
。要使用名称
getter和setter,只需执行以下操作:
me.name = "James Bond";
alert(me.first_name); // should alert James
alert(me.last_name); // should alert Bond
me.last_name = "Dean";
alert(me.name); // should alert James Dean
使用javascript获取/设置机制,不能使用相同的名称将值存储在对象中。例如:
var foo = {
set bar(x) {this.bar=x}
}
上面的代码将编译,但试图设置bar:
foo.bar=1
将由于无限循环而导致堆栈溢出-setter中的this.bar=
将再次调用setter。为什么不使用另一个名称来存储实际字符串(例如.name2
),并将.name
作为函数,然后定义函数中的其他属性?我想你可以。尽管如此,这正是我一直在寻找的。问题是属性和方法(get/set)共享相同的作用域。@slebetman我喜欢这个答案。两个问题:1。因此,这两个概念之间除了使用()或不使用()来触发getter/setter之外,没有其他好处(如果对第一个概念使用第二种策略)?2.如果创建一个对象的新实例,有没有一种方法可以自动运行对象的set机制?我想知道JS中的Document对象是如何工作的,有很多getter/setter属性,比如,children,title,等等。当我在Chrome控制台中浏览它时,我可以看到getter/setter具有相同的名称。@PawełDOM对象通常是用C实现的,而不是用js实现的。在实现getter/setter API之前,已经存在类似getter/setter的行为。事实上,创建getter/setter API是为了允许您模拟DOM属性(如innerHTML)的行为,这在以前是不可能的