有人可以解释一下Object.defineProperty如何在javascript中的构造函数中工作

时间:2015-03-11 13:12:16

标签: javascript

我创建了一个非常简单的对象 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属性?

3 个答案:

答案 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