Dan*_*iel 16 javascript constructor var
例:
function Foo() {
this.bla = 1;
var blabla = 10;
blablabla = 100;
this.getBlabla = function () {
return blabla; // exposes blabla outside
}
}
foo = new Foo();
Run Code Online (Sandbox Code Playgroud)
原始问题:
我知道bla将分配给Foo的每个实例.会发生什么blabla?
新问题:
我现在明白了:
this.bla = 1; // will become an attribute of every instance of FOO.
var blabla = 10; // will become a local variable of Foo(**not** an attribute of every instance of FOO), which could be accessed by any instance of FOO only if there's a method like "this.getBlabla".
blablabla = 100; // will define a **new** (or change if exist) global(window) variable.
Run Code Online (Sandbox Code Playgroud)
[问题:]我理解正确吗?
Nor*_*ard 10
你给任何内部的方法this-即:this.method = function () {}; 虽然里面你的Foo构造函数,是所有将不得不在一个参考blahblah这是唯一的一个的每个实例Foo对象.
function Wallet () {
var balance = 0;
this.checkBalance = function () { return balance; };
this.depositAmount = function (amount) { balance += amount; };
}
var wallet = new Wallet();
wallet.checkBalance(); // 0
wallet.depositAmount(3);
wallet.checkBalance(); // 3
Run Code Online (Sandbox Code Playgroud)
但它完全不受钱包之外的访问,除非你从特权功能返回给某人.
wallet.balance; // undefined;
Run Code Online (Sandbox Code Playgroud)
(添加了一点兴趣 - 如果balance是a string,a number或a boolean,即使你返回它,也不会给人编辑权限,甚至永久查看权限 - 标量变量按值传递,所以你只是通过平衡的价值的时候 -但是,如果余额的object,一个function或一个array,他们不得不永久访问和修改的废话了你的内部工作)
注:方法HAVE构造函数的内部分配这个工作.原型无法访问内部变量.稍后添加方法不会授予他们访问内部变量的权限.
这意味着每个实例将占用更多的内存,因为每个实例都有自己的方法副本,并且拥有自己的变量副本.但是,如果你正在做的事情需要私人数据,这将是获得它的好方法.
在您的示例中blabla是一个局部变量,因此当构造函数结束时它将消失.
如果在构造函数中声明了一个使用该变量的函数,那么该变量将成为该函数闭包的一部分,并且只要该函数存活(即通常与对象一样长):
function Foo() {
this.bla = 1;
var blabla = 10;
this.getBlabla = function() {
alert(blabla); // still here
}
}
Run Code Online (Sandbox Code Playgroud)