在不使用函数调用语法的情况下在调用时计算属性

时间:2014-08-25 12:25:53

标签: javascript

我可以使用任何模式在调用时计算变量(如C#中的属性)

var A = (function() {
    var self = {};
    var a = 0;
    self.x = function (){
        a = a+1;
        return a;
    };
    return self;
});

通常,电话会是:

var bla = A.x();

但我想评估它并将其作为财产获得价值:

var bla = A.x;
console.log(bla); // prints "1"

我不想要()运算符,但我仍然想在访问A.x时计算/计算属性值

3 个答案:

答案 0 :(得分:1)

你一定是在谈论吸气剂和二传手 当你读取(获取)或赋值(设置)一个对象属性时,那些被称为“幕后”的函数 它们非常标准(IE> = 9),但语法有些复杂 看看mdn:
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/defineProperty

(详细)示例,实现由变量支持的属性:

var A = (function() {
   var self = {};
   var x = 0;
   var xPropertyDescriptor = { enumerable : true ,
                               get : function() { return x },
                               set : function(val) { x=val }   };
   Object.defineProperty(self, 'x', xPropertyDescriptor);
   return self;
} () );

在调用defineProperty之后,您可以像常规属性一样访问'x',并且将调用get或set函数。
基本上,写作:

A.x = 12 // will call the getter : function(12) { x=12 }, and set the variable.

请注意,您可以在原型上定义一个getter / setter,以便以后创建更高效​​的对象(否则您必须在每个实例的构造函数中定义它们。)。
然而,在构造函数中定义属性是使用闭包(如上例中)拥有真正私有成员的唯一方法。

使用中:

var res = A.x ;  // res == 0
A.x = 12 ;
var res2 = A.x   //  res2==12

答案 1 :(得分:0)

是的,您可以使用

var bla = A.x;
console.log(bla());
//or
console.log(bla.call());

还有更多选择,但这些是最直接的选择。

答案 2 :(得分:0)

从Ecmascript5开始,您可以使用defineProperty方法来定义属性的getter和setter。

看看这个:http://robertnyman.com/javascript/javascript-getters-setters.html

因此,如链接的示例中所详述,您可以像这样定义一个getter / setter:

var myTest = {
    val : "Initial Value",
    get value () {
        return this.val + " Modified";
    },
    set value(newVal) {
        this.val = newVal;
    }
};

myTest.value // "Initial Value Modified"
myTest.value = "foo"
myTest.value // "foo Modified"
祝你好运。

PS:您应该记住这可能带来的兼容性问题。请阅读链接,您将在那里找到详细信息。