18

我正在使用 XULRunner 并在代码示例中遇到以下模式:

var StrangeSample = {

backingStore : "",

get foo() { return this.backingStore + " "; },

set foo(val) { this.backingStore = val; },

func: function(someParam) { return this.foo + someParam; }
};

StrangeSample.foo = "rabbit";
alert(StrangeSample.func("bear"));

这导致“兔子熊”被警告。

我以前从未在 Javascript 中看到过这种 get/set 模式。它有效,但我找不到任何文档/参考。这是 XUL 特有的东西、最近的语言功能,还是我错过的东西?我很困惑,因为几个月前我专门寻找这样的东西,却找不到任何东西。

作为参考,删除“get”或“set”会导致语法错误。将它们重命名为其他任何名称都是语法错误。它们似乎确实是关键字。

任何人都可以为我阐明这一点,或指出我的参考吗?

4

3 回答 3

14

正如 Martinho 所建议的,这里有一些解释 JS 1.5 中的 getter/setter 的链接:

http://ejohn.org/blog/javascript-getters-and-setters/

http://ajaxian.com/archives/getters-and-setters-in-javascript

但是请注意,它们似乎在 IE 中不受支持,并且一些开发人员(合理地)担心变量赋值具有副作用的想法。

正如丹尼尔指出的那样,get/set 不是保留关键字。我可以毫无问题地创建一个名为“get”和“set”的顶级函数,并使用上面发布的代码示例。所以我假设解析器足够聪明,可以做到这一点。事实上,即使以下内容似乎也是合法的(如果令人困惑):

var Sample = {
   bs : "",
   get get() { return this.bs; },
   set get(val) { this.bs = val; }
 }
于 2011-03-24T12:02:19.687 回答
2

根据 Mozilla的说法,它们不在 ECMAScript 中。

于 2011-03-23T17:42:02.267 回答
0

JavaScript Setter 和 Getter:

通常 setter 和 getter 方法在 JavaScript 对象中遵循以下语法。创建一个具有多个属性的对象。setter 方法有一个参数,而 getter 方法没有参数。两者都是函数。

对于已经在对象中创建的给定属性,set 方法通常是一个 if/else 语句,该语句在以后通过代码(也称为“set”)直接访问和分配该属性的任何时候验证输入。这通常通过使用 if (typeof [arg] === '某些类型的值,例如:数字、字符串或布尔值') 语句来完成,然后代码块通常分配 this.(specific)property-name到论点。(偶尔会有一条消息记录到控制台。)但它不需要返回任何东西;它只是设置 this.specific-property 来评估参数。但是,else 语句几乎总是在控制台上显示(错误)消息日志,提示用户为满足 if 条件的属性键值输入不同的值。

getter 方法基本上是相反的。它设置了一个不带任何参数的函数来“获取”,即当您调用刚刚设置的特定属性时返回一个(另一个)值/属性。它“得到”你的东西不同于你通常响应调用该对象属性所得到的东西。

对于您不希望能够直接修改的属性键值,可以很容易地看到 setter 和 getter 的值,除非满足某些条件。对于这种类型的属性,使用下划线继续属性名称,并使用 getter 使您能够在没有下划线的情况下调用属性。然后使用 setter 定义可以访问和分配属性键值的条件,也就是“set”。例如,我将为这个对象的属性包括两个基本的 setter 和 getter。注意:我使用一个常量变量,因为对象仍然是可变的(在创建之后)。

const person = {
_name: 'Sean';
_age: 27;

set age(ageIn) {
if (typeof ageIn === 'number') {
  this._age = ageIn;
}
else {
  console.log(`${ageIn} is invalid for the age's key-value. Change ${ageIn} to/into a Number.`);
  return 'Invalid Input.';
}
},

get age() {
return this._age;
},

set name(nameIn) {
if (typeof nameIn === 'string') {
        this._name = nameIn;
      } else {
        console.log(`Change ${nameIn} to/into a(ny) String for the name's 
key-value.`);
        return 'Invalid Input.';
    }
},

get name() {
return this._name;
}

};

有趣的是,当您尝试为 _age 属性设置/分配新的键值时,因为它必须满足 if 条件才能成功分配,这意味着并非所有分配都是有效的,等等。

person.age = 'twenty-eight'; /* output: twenty-eight is invalid for the 
age's key-value.  Change twenty-eight to/into a Number. */
console.log(person.age); // output: 27 (twenty-eight was never assigned)
person.age = 28; // output: none
console.log(person.age); // output: 28

请注意,由于 getter 方法,我如何能够通过 person.age 属性访问 person._age 属性。此外,类似于 age 的输入被限制为数字,name 属性的输入现在被限制/设置为字符串。

希望这有助于澄清事情!此外,一些更多的链接:

https://johnresig.com/blog/javascript-getters-and-setters/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get

https://www.infragistics.com/community/blogs/infragistics/archive/2017/09/19/easy-javascript-part-8-what-are-getters-and-setters.aspx

于 2017-10-26T08:56:22.293 回答