我创建了一个非常简单的对象 Person 并使用name
参数调用构造函数,因为我没有在 Person 构造函数中创建任何局部变量,然后如何设置name
属性。
function Person(name) {
Object.defineProperty(this, "name", {
get: function() {
return name;
},
set: function(newName) {
debugger;
name = newName;
},
enumerable: true,
configurable: true
});
this.sayName = function() {
console.log(this.name);
};
}
var p1 = new Person("mike");
如何设置name
属性?
答案 0 :(得分:1)
我没有在
中创建任何局部变量Person
构造函数
name
是一个局部变量,由函数的name
参数声明。此变量用于.name
属性的setter和getter。
答案 1 :(得分:0)
有两种主要方式可以在JavaScript中长期保存变量引用;作为对象属性(myObj = {x: 3}
,x是myObj的一个简单属性),并通过名为“closures”的JavaScript内部系统获取局部变量并维护其引用,只要函数仍然可以访问它们(如属性)存取器)。
局部变量的例子如下:
function myFunction(localVariable1) {
var localVariable2 = ...
...
}
如果myFunction运行一次并结束,则当函数完成时,垃圾收集器将删除localVariable1和localVariable2;它不需要它们。 JavaScript中的一个有用技巧是,如果内部函数需要它们,编译器甚至可以在函数内部保留变量引用。
function myFunction(localVariable1) {
document.onload = function() {
document.write(localVariable1;
};
}
在这种情况下,它将保持对localVariable1的引用,直到文档onload(并且可能在函数仍然存在之后)。在你的情况下,它将保持对象的整个长度,以便那些set和get函数可以对它进行操作。
答案 2 :(得分:0)
调用setter使用p1.name =“test”;
和getter p1.name;
请参阅此示例Example: Custom Setters and Getters
function Archiver() {
var temperature = null;
var archive = [];
Object.defineProperty(this, 'temperature', {
get: function() {
console.log('get!');
return temperature;
},
set: function(value) {
console.log("set:"+value);
temperature = value;
archive.push({ val: temperature });
}
});
this.getArchive = function() { return archive; };
}
var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]
控制台结果
get!
set:11
set:13