Javascript类封装行为

时间:2016-03-04 09:48:26

标签: javascript encapsulation

有人能解释一下这个javascript行为吗?我创建了2个对象(xy),并调用x.m()来修改b上的私有变量x。然后我在xy上调用打印方法,它会产生以下输出。如果将打印方法p()定义为this属性(1)或原型(2),则输出会有所不同。

this.p定义按预期运行:2个对象有两个私有变量,在b上修改x属性不会影响y' s {{1}属性。但是使用b定义,A.prototype.p属性似乎是对象bx共有的静态变量。

代码中描述的行为:

y

产生

function A() {
  var b = "bbb";

  function f() {
    b = "ccc";
  }

  // 1)
  this.p = function() {
    console.log(b);
  };

  // 2)
  //A.prototype.p = function() {
  //  console.log(b);
  //};

  A.prototype.m = function() {
    f();
  };
}

var x = new A();
var y = new A();

x.m();
x.p();
y.p();

1 个答案:

答案 0 :(得分:0)

在您的示例中,您将覆盖m构造函数中的原型方法A(以及A),这意味着每次创建实例时,原型方法都将更改。然后,function A() { this.b = "bbb"; } A.prototype.p = function() { console.log(this.b); }; A.prototype.m = function() { this.b = "ccc"; }; var x = new A(), y = new A(); x.m(); x.p(); y.p(); 的所有实例将使用相同的方法,即最后创建的实例之一。

看看这个示例,它应该显示您期望的代码行为:

{{1}}