Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 原型问题_Javascript_Prototype - Fatal编程技术网

Javascript 原型问题

Javascript 原型问题,javascript,prototype,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); }

我有一个简单的问题,但我不明白

<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>

var man=函数(){
变量年龄=1;
这双鞋=2;
};
man.prototype={
创建:函数(){
//年龄=5岁;
控制台日志(年龄);
console.log(这个.shoes);
}
}
var man1=新的人;
man1.create();
-好的,我创造了一个有两个变量的男人,年龄和鞋子。我只在鞋子里用“这个”。在我将一种方法原型化之后

-如果我执行此代码,则first console.log会告诉我:

未捕获引用错误:未定义年龄(逻辑)

第二个控制台是“2”(正确)

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

-但如果我在新方法中为age(age=5)(不使用“var”来创建var)设置一个值,它就可以工作了


为什么我只能在阅读本文之前输入一个值时才使用年龄变量?

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

如果要使其可从外部访问,请将其添加到此中,或创建一个getter函数,如:

var man = function(){
    var age = 1;
    this.shoes = 2;
    this.getAge = function() { return age; };
};
但是,如果您没有将declare变量放入函数中,但仍然设置了它,那么它将在全局对象上的浏览器
窗口中定义。这将不会在man对象上提供age,但您可以在任何地方访问它。这里有一个简单的例子来澄清一下:

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

age变量位于“constructors”闭包中,这使得它仅在那里可用。可以在该函数(闭包)内部使用年龄变量,但不能在外部使用

如果要使其可从外部访问,请将其添加到此中,或创建一个getter函数,如:

var man = function(){
    var age = 1;
    this.shoes = 2;
    this.getAge = function() { return age; };
};
但是,如果您没有将declare变量放入函数中,但仍然设置了它,那么它将在全局对象上的浏览器
窗口中定义。这将不会在man对象上提供age,但您可以在任何地方访问它。这里有一个简单的例子来澄清一下:

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

当您在函数中使用
var
时,它在函数中可用(本地范围)

此处
age
仅在
man
方法/构造函数中可用,因为这会创建一个局部范围,或者说是
构造函数的私有范围

man.prototype = {

    create: function(){

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

    }

}
此处
age
将创建一个全局范围。也就是说,这相当于
window.age=5
,因此可以在整个应用程序中使用。因此,您将能够在任何函数中检索值,因为它现在是全局的


这必须避免,因为它不会被自动垃圾收集(GC)。如果您确实需要它,因为代码的其他部分有一个依赖项w.r.t.它,您可以将其命名为:
MyApp.age=5
。但鉴于您目前的情况,我认为这里没有必要。

当您在函数中使用
var
时,它在函数中可用(局部范围)

此处
age
仅在
man
方法/构造函数中可用,因为这会创建一个局部范围,或者说是
构造函数的私有范围

man.prototype = {

    create: function(){

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

    }

}
此处
age
将创建一个全局范围。也就是说,这相当于
window.age=5
,因此可以在整个应用程序中使用。因此,您将能够在任何函数中检索值,因为它现在是全局的


这必须避免,因为它不会被自动垃圾收集(GC)。如果您确实需要它,因为代码的其他部分有一个依赖项w.r.t.它,您可以将其命名为:
MyApp.age=5
。但鉴于你目前的情况,我觉得这里没有必要。

哦,再看一下描述,现在我不回答这个问题了。Will fixOk,我明白,问题是我一直认为变量只能用“var”项启动,而不能没有扩展了我的答案,解释了为什么不在函数中声明变量使其在任何地方都可用。如果没有必要,为什么人们使用“var”术语来启动变量?(像php)哦,那我想你误解了。如果您没有通过添加
var
来声明变量,那么它将在全局对象上声明。意思是每次设置都会改变它。我会尽量扩展我的解释。哦,再看一遍描述,看看我现在没有回答这个问题。Will fixOk,我明白,问题是我一直认为变量只能用“var”项启动,而不能没有扩展了我的答案,解释了为什么不在函数中声明变量使其在任何地方都可用。如果没有必要,为什么人们使用“var”术语来启动变量?(像php)哦,那我想你误解了。如果您没有通过添加
var
来声明变量,那么它将在全局对象上声明。意思是每次设置都会改变它。我会尽量扩展我的解释。范围问题。原型功能无法访问它。但是,将其移到构造函数之外可以访问它。在原型中定义
age=5
实际上不会更改第一个
age
变量,因为该变量受保护。范围问题。原型功能无法访问它。但是,将其移到构造函数之外可以访问它。在原型中定义
age=5
实际上不会更改第一个
age
变量,因为该变量受保护。