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
变量,因为该变量受保护。