【问题标题】:Re:Javascript closure. How the variable inside of the mother object become the same as the mother object?回复:Javascript 关闭。母对象内部的变量如何与母对象相同?
【发布时间】:2018-10-20 06:31:51
【问题描述】:

我有一个关于公共变量和闭包的问题。 在下面的代码中,母亲内部的'temp'变量是怎么来的 对象可以像母对象一样使用吗?

例如,在下面的代码中,如果你输入

console.log(pizzaA.getToppings());

你可以得到“3”

有点混乱,因为如果您返回“temp”,它仍然是 母亲对象。所以这意味着,我想我必须输入如下 “console.log(pizzaA.temp.getToppings());”

不是吗?

var Pizza = function () {
    var crust = 'thin'; 
    var toppings = 3; 
    var getToppings = function () { return toppings; }; ​ 
    var temp = {};
    temp.getToppings = getToppings;
    ​return temp;
};

var pizzaA = new Pizza(); 
console.log(pizzaA.getToppings());

【问题讨论】:

  • Pizza 不是构造函数,因为您从它返回一个对象。 JavaScript 中没有“公共变量”之类的东西。 temp 是一个变量,不是任何东西的属性。
  • 非Java反模式的写法是jsfiddle.net/L2g2hzkt

标签: javascript scope closures


【解决方案1】:

temp 不是实例化对象的属性 - 它是实例化对象本身。当构造函数返回一个对象时,该对象正是调用构造函数的结果被分配给的对象。也就是说,当你这样做时

var pizzaA = new Pizza();

比萨有

return temp;

然后temp 对象被分配给pizzaA。由于temp对象有一个属性getToppings,所以可以直接在temp上调用getToppings,也可以直接在pizzaA上调用,因为它们都引用了内存中的同一个对象。

【讨论】:

  • 谢谢大家!所以,当有返回时,返回的结果会被赋值给对象的实例,在本例中是“pizzaA”,谢谢!
  • 当您使用new 调用函数时,如果该函数显式返回某些内容,则仅当返回值为对象时才会将其分配给结果。 如果返回值不是对象,它将被忽略。例如jsfiddle.net/46708zt4 但是,正如其他人所说,使用new 调用的函数不应该明确返回一些东西。
【解决方案2】:

重点:

  1. Javascript 函数表现为一个类
  2. 函数中的this 关键字表现为类的实例

你可以做任何一个

var Pizza = function () {
    this.crust = 'thin'; 
    this.toppings = 3; 
    this.getToppings = function () {
      return this.toppings;
    };
};

var pizza = new Pizza();
console.log(pizza.getToppings()); //prints 3

OR(更通用的方式)

var Pizza = function (options) {
    var crust = options.crust; 
    var toppings = options.toppings; 
    this.getToppings = function () {
        return toppings;
    };
    this.getCrust = function () {
        return crust;
    };
};

var pizza = new Pizza({ crust: 'thin', toppings: 3 });
console.log(pizza.getToppings()); //prints 3
console.log(pizza.getCrust()); //prints thin

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 2022-01-17
    相关资源
    最近更新 更多