繁体   English   中英

这些功能之间的差异

[英]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一起使用,并制作了两个对象kj this就可以访问k.name === 'kkkk'j.name === 'jjjj'

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

第三个类似于第二个,但是不滥用new k3j3undefined ,如果尝试访问k3.namej3.name ,则会出现错误。 同样,您将能够使用person3.name访问上次传递给person3的值。

您的第二和第三个函数不会为person2.nameperson3.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 ,它将存储函数参数中的值-这将是更正常的用法。 您的kj对象都具有使用此语法的name属性。

第二个版本再次使用new person2()语法,将创建作为person2实例的person2 ,但是要说person2.name在函数本身上创建一个属性。 因此,无法直接从实例k2j2访问该属性,并且每次调用person2()person2.name属性都会被覆盖。 一般而言,在这样的函数上具有属性是没有问题的,但是在这种情况下,除非您确实需要记住与最近调用相关的名称,否则这实际上没有任何意义。

第三个版本,不使用new关键字,只会将person3()的返回值分配给k3j3变量,但是由于您未明确返回任何内容,它们最终将以undefined结束。 而且person3.name工作方式与person2

编辑:除此以外,请注意, name在函数上下文中具有特殊含义,因此对于第二个和第三个选项,它的行为将与使用其他名称没有特殊含义的属性创建的属性完全不同,例如, myName

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM