我是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
感谢。
答案 0 :(得分:1)
在原型上定义属性,而不是实例:
Object.defineProperties(Cell.prototype, {
...
您获得了无限循环,因为this.make
与您定义的make
属性相同。