2012-01-29 87 views
0

这3个函数有什么区别?新操作符在第二个函数中有什么用处?为什么要在第三个函数上使用第一个函数?这些函数的区别

首先

var person = function(name){ 
    this.name = alert(name); 
}; 

var k = new person('kkkk'); 
var j = new person('jjjj'); 

var person2 = function(name){ 
    person2.name = alert(name); 
}; 

var k2 = new person2('kkkk2'); 
var j2 = new person2('jjjj2'); 

var person3 = function(name){ 
    person3.name = alert(name); 

}; 

var k3 = person3('kkkk3'); 
var j3 = person3('jjjj3'); 
+0

'new'用于执行构造调用(相对于“regualar”(功能)调用)。在构造函数内部,你想要使用'this'为了添加东西到新创建的实例。 – 2012-01-29 01:51:49

回答

5

alert实际上很难检查效果,所以在我的解释中,我假设alert(name)实际上是name。 (alert返回undefined,而不是其输入)

第一个功能可以像班级一样使用。然后,您将它与new一起使用,并创建了两个对象kj。该this说得那么您可以访问的名称,使得k.name === 'kkkk'j.name === 'jjjj'

第二个类似于第一个,但k2.namej2.nameundefined。您可以访问person2.name,但这只与上次实例化它的名称相同;因此,person2.name === 'jjjj2'

;三是类似于第二个,但不滥用newk3j3undefined,如果您尝试访问k3.namej3.name,你会得到一个错误。再次,您将可以访问最后传递到person3的值person3.name

+0

我在控制台中运行第二个和第三个示例(在用名称替换alert(name)后)。然后我运行console.log(person2.name)和console.log(person3.name)。两个都输出空字符串。这不是你的其他很好的答案的矛盾部分吗?另外,请问“不滥用名字”是什么意思? – clime 2012-01-29 02:16:40

+0

@clime:哦,我忘了函数上的'name'用于别的东西。如果您将'name'重命名为'name2',那么它应该如我所描述的那样工作。要回答你的另一个问题,那是一个错字; “不滥用'name'”应该是“不滥用'new'”。 – icktoofay 2012-01-29 02:53:56

+0

是的,它的工作原理与person3.name替换person3.name后描述的一样。 name2在这里就像一个静态属性? – clime 2012-01-29 03:06:43

1

你的第二个和第三个功能不会指派任何东西person2.nameperson3.name。所以在技术上只有你的第一个功能是有效的,这就是它应该被使用的原因。

有在JavaScript中一个非常重要的概念叫做context。上下文可以被认为是一个对象。 this关键字是指函数正在执行的上下文。

您可以创建在当前背景下的新属性与this帮助。例如:

var person = function(name) { 
    this.name = name; // this can be accessed externally, just like public properties 
    var _name = name; // this can be accessed only within the function, just like a private property 
    __name = name; // if a property is not properly initialized with a 'var' or 'this', it becomes part of 'window' object, hence you can access it from anywhere using 'window.__name' 
} 

您可以使用new关键字新的上下文:

var k = new person2('kkkk2'); // this will create a new context, create a property name in it and assign it value passed to function. 
var j = new person('jjjj'); // this will create another context 

您可以随时访问不同的背景和他们的属性:

alert(k.name); // this will show 'kkkk2' 
alert(j.name); // this will show 'jjjj' 
1

第一个声明的函数,person(),这是(大概)打算作为一个对象的构造函数 - 最接近的类的JavaScript来有类。这意味着,如果你把它与new person() JS将创建一个person对象的新实例,并在构造函数this内指的是新的实例,以this.name创建的实例的属性。不幸的是你已经分配给该属性的值是undefined因为alert()函数返回undefined。如果你说this.name = name它会存储在函数参数中的值 - 这将是一个更正常的用法。你kj对象都有一个name属性使用该语法。

的第二个版本,同样具有new person2()语法,将创建一个是person2实例的对象,但是他说person2.name上创建函数自身的属性。使物业不能访问直接从实例k2j2,每一次你打电话person2()person2.name财产被覆盖。有一个在一般意义上具有这样的功能性都没有问题,但在这种情况下,它并没有真正意义,除非你真的需要记住与最近调用相关的名称。

第三个版本,而不使用new关键字,会简单地从分配给person3()k3j3变量的返回值,但是因为你不明确地返回任何他们最终会为undefinedperson3.name的工作方式与person2完全相同。

编辑:除了,请注意,name在函数的上下文中有特殊的含义,所以对于第二个和第三个选项,它不会像您创建一个没有其他名称的属性特殊含义,例如myName