[英]difference between these functions
这三个功能有什么区别? 第二个函数中的new运算符有什么用? 为什么要使用第一个功能而不是第三个功能?
第一
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');
alert
实际上使检查效果变得非常困难,因此在我的解释中,我将假定alert(name)
实际上是name
。 ( alert
返回undefined
,而不是其输入)
第一个函数可以像类一样使用。 然后,将它与new
一起使用,并制作了两个对象k
和j
。 this
就可以访问k.name === 'kkkk'
和j.name === 'jjjj'
。
第二个类似于第一个,但是k2.name
和j2.name
是undefined
。 您可以访问person2.name
,但这仅与您上次实例化它的名称相同。 因此, person2.name === 'jjjj2'
。
第三个类似于第二个,但是不滥用new
。 k3
和j3
是undefined
,如果尝试访问k3.name
和j3.name
,则会出现错误。 同样,您将能够使用person3.name
访问上次传递给person3
的值。
您的第二和第三个函数不会为person2.name
和person3.name
分配任何person3.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'
第一个声明一个函数person()
,该函数(大概)打算用作对象构造函数-最接近JavaScript的类就是拥有类。 这意味着,如果使用new person()
调用它,JS将创建一个person
对象的新实例,并且在构造函数中, this
引用该新实例,因此this.name
在该实例上创建一个属性。 不幸的是,您分配给该属性的值是undefined
因为alert()
函数返回的是undefined
。 如果您说this.name = name
,它将存储函数参数中的值-这将是更正常的用法。 您的k
和j
对象都具有使用此语法的name
属性。
第二个版本再次使用new person2()
语法,将创建作为person2
实例的person2
,但是要说person2.name
在函数本身上创建一个属性。 因此,无法直接从实例k2
和j2
访问该属性,并且每次调用person2()
, person2.name
属性都会被覆盖。 一般而言,在这样的函数上具有属性是没有问题的,但是在这种情况下,除非您确实需要记住与最近调用相关的名称,否则这实际上没有任何意义。
第三个版本,不使用new
关键字,只会将person3()
的返回值分配给k3
和j3
变量,但是由于您未明确返回任何内容,它们最终将以undefined
结束。 而且person3.name
工作方式与person2
。
编辑:除此以外,请注意, name
在函数上下文中具有特殊含义,因此对于第二个和第三个选项,它的行为将与使用其他名称没有特殊含义的属性创建的属性完全不同,例如, myName
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.