原型问题

时间:2015-05-03 19:07:01

标签: javascript prototype

我有一个简单的问题,但我无法理解。

<script type="text/javascript">

var man = function(){

    var age = 1;

    this.shoes = 2;

};

man.prototype = {

    create: function(){

        //age = 5;
        console.log(age);
        console.log(this.shoes);

    }

}
var man1 = new man;
man1.create();
</script>

-Ok,我创造了一个有2个vars,年龄和鞋子的男人。我用&#34;这个&#34;只在鞋子里在我用人工原型方法之后。

- 如果我执行此代码,首先是console.log说我:

未捕获的ReferenceError:未定义年龄(逻辑)

第二个控制台是&#34; 2&#34; (修正)。

- 如果我写:console.log(this.age)消息错误是:undefined。

- 但是如果我在新方法中为年龄(年龄= 5)(不使用&#34; var&#34; for create var)设置了一个值,它就可以工作。

为什么我只能使用age var,如果我在阅读之前输入了一个值,但是?

2 个答案:

答案 0 :(得分:2)

年龄变量在“构造函数”闭包内,这使得它只在那里可用。您可以在该函数内使用age变量(闭包),但不能在外部使用。

如果您想让它可以从外部访问,请将其添加到此处或制作类似以下的getter函数:

var man = function(){
    var age = 1;
    this.shoes = 2;
    this.getAge = function() { return age; };
};

但是如果你没有在函数中声明变量,但仍然设置它,那么它将在浏览器window中的全局对象上定义。这不会使man对象的年龄可用,但您可以在任何地方访问它。这是一个澄清一点:

function tellAgeDelayedGlobal() {
    age = 1;
    setTimeout(function() { console.log(age) }, 1000);   
}

function tellAgeDelayedDeclared() {
    var age = 1;
    setTimeout(function() { console.log(age) }, 1000);   
}

tellAgeDelayedGlobal();
tellAgeDelayedDeclared();
age = 2;

这将打印到控制台:

2
1

答案 1 :(得分:2)

在函数中使用ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleWithFixedDelay(new MyRunnable(), 0, 5, TimeUnit.SECONDS); 时,它在其中可用(本地范围)。

var

此处var man = function(){ var age = 1; this.shoes = 2; }; 仅在age方法/构造函数中可用,因为这会为构造函数创建一个本地范围,或者更为man

private

这里man.prototype = { create: function(){ age = 5; console.log(age); console.log(this.shoes); } } 将创建一个全局范围。也就是说,这相当于age,因此可以在整个应用中使用它。因此,您可以在任何函数中检索该值,因为它现在是全局的。

必须避免这种情况,因为它不会自动进行垃圾回收(GC)。如果你真的需要它,因为你的代码的其他部分有一个依赖w.r.t.它,你可以命名为:window.age = 5。但是,根据你目前的情况,我在这里找不到需要。