2016-03-04 59 views
2

有人可以解释我这个JavaScript行为吗?我创建了2个对象(x,y),并且我拨打x.m()修改了x上的私有变量b。然后,我在xy上调用打印方法,并生成以下输出。如果打印方法p()定义为this属性(1)或作为原型(2),则输出会有所不同。Javascript类封装行为

this.p定义作为预期:2级的对象有两个私有变量,对x修改b属性不影响yb财产。但与A.prototype.p定义,b财产似乎是静态变量共同为对象xy

在代码

描述的行为:

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) 
bbbb 
ccc 

// 2) 
//ccc 
//ccc 
+2

不要设置原型方法A'的'构造。这样,每次创建“A”实例时,都会覆盖原型方法'm'和'p'。 –

回答

0

在您的示例中,将在A构造,这意味着重写原型方法p(以及m)每次创建实例时,原型方法都会改变。 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(); 
+0

好吧,但我需要'b'是一个私人财产。 –

+1

一个常见的约定是使用下划线前缀私有属性,所以你可以将它命名为this._b。要拥有真正的私有属性,必须使用类似于示例版本1中的闭包。另请参见:https://developer.mozilla.org/zh-CN/Add-ons/SDK/Guides/Contributor_s_Guide/Private_Properties –

+0

使用闭包(而不是原型)似乎是一种适合我的方式。谢谢 –