JavaScript Self Invoking函数属性

时间:2017-01-07 07:43:41

标签: javascript

尝试更好地理解JS,有一些澄清。让我们假设我们有以下方法

var customer = function(){
            var name = "Contoso";
            return {
                getName : function(){
                    return this.name;
                },
                setName : function(newName){
                    this.name = newName;
                }
            }
        }();

为什么名称在外面不可见?,当我们记录(customer.name)其未定义时,但是如果我们删除函数的自初始化括号并将变量声明更改为(this.name)&再次当我们记录相同时,我们能够看到价值。我在这里缺少什么。

2 个答案:

答案 0 :(得分:1)

您需要考虑JavaScript实际上没有本机类。有了这个说,你可以创建构造函数以“模仿”一个类并且能够使用this,你需要创建这样的东西:

function fnc (string) {
  this.string = string; 
}

fnc.prototype.getString = function() {
  return this.string;
}

var x = new fnc('bar');
console.log(x.getString()); //bar

这称为构造函数模式。 你要做的是使用一个名为Module Pattern的东西,它的工作原理如下:

var fn = (function() {
  var string = 'foo';
  return {
    getString() {
      return string;
    }
  }
})();

console.log(fn.getString()); //foo

以下是一个工作示例:https://repl.it/FCn7

另外,好读:https://addyosmani.com/resources/essentialjsdesignpatterns/book/

修改 使用getStringsetString与模块模式

的示例
var fn = (function() {
  var string = 'foo';
  return {
    getString() {
      return string;
    },
    setString(str){
      string = str;
    }
  }
})();

fn.setString('xyz');
console.log(fn.getString()); // xyz

答案 1 :(得分:0)

var正在函数范围内创建变量,这在函数属性外部不可用。如果您想访问customer.name等属性,则需要按照您的注意事项将其初始化为this.name

在这个例子中,

var就像创建私有变量一样,可以通过函数修改,但不能直接修改。

这样可行:

var customer = function(){
    var name = "Contoso";
    return {
        getName : function(){
            return name;
        },
        setName : function(newName){
            name = newName;
        }
    }
}();