Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6中存在的getter方法在ES6之前的替代方案是什么_Javascript_Ecmascript 6_Getter_Es5 Shim - Fatal编程技术网

Javascript ES6中存在的getter方法在ES6之前的替代方案是什么

Javascript ES6中存在的getter方法在ES6之前的替代方案是什么,javascript,ecmascript-6,getter,es5-shim,Javascript,Ecmascript 6,Getter,Es5 Shim,ES6中的Getter方法定义为方法并称为属性(调用obj.method,而不是obj.method(…)) 例如: class Job { constructor(){ this.start=new Date(); } get age(){ return new Date()-this.start; } } 然后: var vm=new Job(); //.... vm.age // call Getter method

ES6中的Getter方法定义为方法并称为属性(调用
obj.method
,而不是
obj.method(…)

例如:

class Job  {
    constructor(){
        this.start=new Date();
    }

    get age(){
        return new Date()-this.start;
    }
}
然后:

var vm=new Job();
//....
vm.age // call Getter method  

我的问题是:ES6之前的替代方案是什么,如果有的话?

自ES5以来,您已经能够使用定义getter和setter了。您的ES6代码本质上是以下ES5代码的语法糖:

function Job ( ) {
    this.start = new Date;
}

Object.defineProperty( Job.prototype, 'age', {
  get: function ( ) { return new Date - this.start; }
} );
在此之前,有些引擎对getter提供了非标准支持,例如,可以这样使用getter来复制您的功能:

Job.prototype.__defineGetter__( 'age', function ( ) {
  return new Date - this.start;
} );
SpiderMonkey在更早的时候也有一些其他的方法:

Job.prototype.age getter = function() {
    return new Date - this.start;
};

// or, this one, which declares age as a variable in the local scope that acts like a getter

getter function age() { ... };

除了在ES6中仍然非常有用的
Object.defineProperty
之外,这些方法现在都不应该使用。

因为ES5对象的每个属性都有一个Getter和Setter函数。 您可以在此处找到完整的文档:

创建对象时,可以定义新特性,并告知获取和设置该值时要使用哪些函数:

var obj = {};

Object.defineProperty( obj, 'propName', {
  get: function() { return 42; },
  set: function(newValue){ this.propName = newValue; }
});

在ES6代码中,您要做的是定义一个新的构造函数,然后为
年龄定义
get
ter

ES5中的对象文本也可以使用语法!不是方法,也不是作为属性调用,而是“称为属性”。@torazaburo:删除了太多的空白;)