使用构造函数创建的JavaScript对象上的Getters和Setter

时间:2014-06-11 09:14:12

标签: javascript

我是JavaScript的新手。我使用构造函数创建了一个构造函数和一个对象。代码如下

var Cell = function Cell(make, model, price){
  this.make = make;
  this.model = model;
  this.price = price;
}

var motog = new Cell('Motorola', 'moto g', 14000);

Object.defineProperties(motog, {
  "make": { 
    get: function() { 
      console.log('make getter called'); 
      return this.make; 
    },
    set: function(make) { 
      console.log('make setter called'); 
      this.make = make; 
    }
  },
  "model": { 
    get: function() { 
      console.log('model getter called'); 
      return this.model; 
    },
    set: function(model) { 
      console.log('model setter called'); 
      this.model = model; 
    }
  }
});

console.log('------------------1');
console.log(motog.make);
console.log('------------------2');
motog.make = 'Google';

我在getter和setter中添加了日志语句以查看执行跟踪。我的问题是:

1)可以使用构造函数或对象初始值设定项(声明属性及其值)来创建对象。上面的方法是为使用构造函数创建的对象添加getter和setter吗?

2)当我运行上面的代码时,它进入无限循环打印来自'make'的getter的log语句。循环终止如下。代码怎么了?

make getter called
make getter called
make getter called

RangeError: Maximum call stack size exceeded
    at String.replace (native)
    at Console.exports.format (util.js:35:23)
    at Console.log (console.js:53:34)
    at Cell.Object.defineProperties.make.get [as make

感谢。

1 个答案:

答案 0 :(得分:1)

在原型上定义属性,而不是实例:

Object.defineProperties(Cell.prototype, {
  ...

您获得了无限循环,因为this.make与您定义的make属性相同。